@illuma-ai/agents 1.0.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/README.md +485 -0
  2. package/dist/cjs/agents/AgentContext.cjs +734 -0
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -0
  4. package/dist/cjs/common/enum.cjs +190 -0
  5. package/dist/cjs/common/enum.cjs.map +1 -0
  6. package/dist/cjs/events.cjs +172 -0
  7. package/dist/cjs/events.cjs.map +1 -0
  8. package/dist/cjs/graphs/Graph.cjs +1615 -0
  9. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs +890 -0
  11. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
  12. package/dist/cjs/instrumentation.cjs +21 -0
  13. package/dist/cjs/instrumentation.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  15. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  17. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +630 -0
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  22. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  23. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  24. package/dist/cjs/llm/bedrock/index.cjs +282 -0
  25. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  26. package/dist/cjs/llm/fake.cjs +97 -0
  27. package/dist/cjs/llm/fake.cjs.map +1 -0
  28. package/dist/cjs/llm/google/index.cjs +216 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -0
  30. package/dist/cjs/llm/google/utils/common.cjs +647 -0
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/index.cjs +1028 -0
  33. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openai/utils/index.cjs +765 -0
  35. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  36. package/dist/cjs/llm/openrouter/index.cjs +212 -0
  37. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  38. package/dist/cjs/llm/providers.cjs +43 -0
  39. package/dist/cjs/llm/providers.cjs.map +1 -0
  40. package/dist/cjs/llm/text.cjs +69 -0
  41. package/dist/cjs/llm/text.cjs.map +1 -0
  42. package/dist/cjs/llm/vertexai/index.cjs +329 -0
  43. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  44. package/dist/cjs/main.cjs +240 -0
  45. package/dist/cjs/main.cjs.map +1 -0
  46. package/dist/cjs/messages/cache.cjs +387 -0
  47. package/dist/cjs/messages/cache.cjs.map +1 -0
  48. package/dist/cjs/messages/content.cjs +53 -0
  49. package/dist/cjs/messages/content.cjs.map +1 -0
  50. package/dist/cjs/messages/core.cjs +367 -0
  51. package/dist/cjs/messages/core.cjs.map +1 -0
  52. package/dist/cjs/messages/format.cjs +761 -0
  53. package/dist/cjs/messages/format.cjs.map +1 -0
  54. package/dist/cjs/messages/ids.cjs +23 -0
  55. package/dist/cjs/messages/ids.cjs.map +1 -0
  56. package/dist/cjs/messages/prune.cjs +398 -0
  57. package/dist/cjs/messages/prune.cjs.map +1 -0
  58. package/dist/cjs/messages/tools.cjs +96 -0
  59. package/dist/cjs/messages/tools.cjs.map +1 -0
  60. package/dist/cjs/run.cjs +328 -0
  61. package/dist/cjs/run.cjs.map +1 -0
  62. package/dist/cjs/schemas/validate.cjs +324 -0
  63. package/dist/cjs/schemas/validate.cjs.map +1 -0
  64. package/dist/cjs/splitStream.cjs +210 -0
  65. package/dist/cjs/splitStream.cjs.map +1 -0
  66. package/dist/cjs/stream.cjs +620 -0
  67. package/dist/cjs/stream.cjs.map +1 -0
  68. package/dist/cjs/tools/BrowserTools.cjs +248 -0
  69. package/dist/cjs/tools/BrowserTools.cjs.map +1 -0
  70. package/dist/cjs/tools/Calculator.cjs +66 -0
  71. package/dist/cjs/tools/Calculator.cjs.map +1 -0
  72. package/dist/cjs/tools/CodeExecutor.cjs +234 -0
  73. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  74. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +636 -0
  75. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -0
  76. package/dist/cjs/tools/ToolNode.cjs +548 -0
  77. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  78. package/dist/cjs/tools/ToolSearch.cjs +909 -0
  79. package/dist/cjs/tools/ToolSearch.cjs.map +1 -0
  80. package/dist/cjs/tools/handlers.cjs +255 -0
  81. package/dist/cjs/tools/handlers.cjs.map +1 -0
  82. package/dist/cjs/tools/schema.cjs +31 -0
  83. package/dist/cjs/tools/schema.cjs.map +1 -0
  84. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  85. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  86. package/dist/cjs/tools/search/content.cjs +140 -0
  87. package/dist/cjs/tools/search/content.cjs.map +1 -0
  88. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  89. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  90. package/dist/cjs/tools/search/format.cjs +203 -0
  91. package/dist/cjs/tools/search/format.cjs.map +1 -0
  92. package/dist/cjs/tools/search/highlights.cjs +245 -0
  93. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  94. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  95. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  96. package/dist/cjs/tools/search/schema.cjs +117 -0
  97. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  98. package/dist/cjs/tools/search/search.cjs +566 -0
  99. package/dist/cjs/tools/search/search.cjs.map +1 -0
  100. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  101. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  102. package/dist/cjs/tools/search/tool.cjs +456 -0
  103. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  104. package/dist/cjs/tools/search/utils.cjs +66 -0
  105. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  106. package/dist/cjs/types/graph.cjs +29 -0
  107. package/dist/cjs/types/graph.cjs.map +1 -0
  108. package/dist/cjs/utils/contextAnalytics.cjs +66 -0
  109. package/dist/cjs/utils/contextAnalytics.cjs.map +1 -0
  110. package/dist/cjs/utils/events.cjs +31 -0
  111. package/dist/cjs/utils/events.cjs.map +1 -0
  112. package/dist/cjs/utils/graph.cjs +16 -0
  113. package/dist/cjs/utils/graph.cjs.map +1 -0
  114. package/dist/cjs/utils/handlers.cjs +70 -0
  115. package/dist/cjs/utils/handlers.cjs.map +1 -0
  116. package/dist/cjs/utils/llm.cjs +27 -0
  117. package/dist/cjs/utils/llm.cjs.map +1 -0
  118. package/dist/cjs/utils/misc.cjs +56 -0
  119. package/dist/cjs/utils/misc.cjs.map +1 -0
  120. package/dist/cjs/utils/run.cjs +73 -0
  121. package/dist/cjs/utils/run.cjs.map +1 -0
  122. package/dist/cjs/utils/schema.cjs +27 -0
  123. package/dist/cjs/utils/schema.cjs.map +1 -0
  124. package/dist/cjs/utils/title.cjs +125 -0
  125. package/dist/cjs/utils/title.cjs.map +1 -0
  126. package/dist/cjs/utils/tokens.cjs +125 -0
  127. package/dist/cjs/utils/tokens.cjs.map +1 -0
  128. package/dist/cjs/utils/toonFormat.cjs +388 -0
  129. package/dist/cjs/utils/toonFormat.cjs.map +1 -0
  130. package/dist/esm/agents/AgentContext.mjs +732 -0
  131. package/dist/esm/agents/AgentContext.mjs.map +1 -0
  132. package/dist/esm/common/enum.mjs +190 -0
  133. package/dist/esm/common/enum.mjs.map +1 -0
  134. package/dist/esm/events.mjs +164 -0
  135. package/dist/esm/events.mjs.map +1 -0
  136. package/dist/esm/graphs/Graph.mjs +1612 -0
  137. package/dist/esm/graphs/Graph.mjs.map +1 -0
  138. package/dist/esm/graphs/MultiAgentGraph.mjs +888 -0
  139. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
  140. package/dist/esm/instrumentation.mjs +19 -0
  141. package/dist/esm/instrumentation.mjs.map +1 -0
  142. package/dist/esm/llm/anthropic/index.mjs +290 -0
  143. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  144. package/dist/esm/llm/anthropic/types.mjs +48 -0
  145. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  146. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +627 -0
  147. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  148. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  149. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  150. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  151. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  152. package/dist/esm/llm/bedrock/index.mjs +280 -0
  153. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  154. package/dist/esm/llm/fake.mjs +94 -0
  155. package/dist/esm/llm/fake.mjs.map +1 -0
  156. package/dist/esm/llm/google/index.mjs +214 -0
  157. package/dist/esm/llm/google/index.mjs.map +1 -0
  158. package/dist/esm/llm/google/utils/common.mjs +638 -0
  159. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  160. package/dist/esm/llm/openai/index.mjs +1018 -0
  161. package/dist/esm/llm/openai/index.mjs.map +1 -0
  162. package/dist/esm/llm/openai/utils/index.mjs +759 -0
  163. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  164. package/dist/esm/llm/openrouter/index.mjs +210 -0
  165. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  166. package/dist/esm/llm/providers.mjs +39 -0
  167. package/dist/esm/llm/providers.mjs.map +1 -0
  168. package/dist/esm/llm/text.mjs +67 -0
  169. package/dist/esm/llm/text.mjs.map +1 -0
  170. package/dist/esm/llm/vertexai/index.mjs +327 -0
  171. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  172. package/dist/esm/main.mjs +37 -0
  173. package/dist/esm/main.mjs.map +1 -0
  174. package/dist/esm/messages/cache.mjs +382 -0
  175. package/dist/esm/messages/cache.mjs.map +1 -0
  176. package/dist/esm/messages/content.mjs +51 -0
  177. package/dist/esm/messages/content.mjs.map +1 -0
  178. package/dist/esm/messages/core.mjs +359 -0
  179. package/dist/esm/messages/core.mjs.map +1 -0
  180. package/dist/esm/messages/format.mjs +752 -0
  181. package/dist/esm/messages/format.mjs.map +1 -0
  182. package/dist/esm/messages/ids.mjs +21 -0
  183. package/dist/esm/messages/ids.mjs.map +1 -0
  184. package/dist/esm/messages/prune.mjs +393 -0
  185. package/dist/esm/messages/prune.mjs.map +1 -0
  186. package/dist/esm/messages/tools.mjs +93 -0
  187. package/dist/esm/messages/tools.mjs.map +1 -0
  188. package/dist/esm/run.mjs +325 -0
  189. package/dist/esm/run.mjs.map +1 -0
  190. package/dist/esm/schemas/validate.mjs +317 -0
  191. package/dist/esm/schemas/validate.mjs.map +1 -0
  192. package/dist/esm/splitStream.mjs +207 -0
  193. package/dist/esm/splitStream.mjs.map +1 -0
  194. package/dist/esm/stream.mjs +616 -0
  195. package/dist/esm/stream.mjs.map +1 -0
  196. package/dist/esm/tools/BrowserTools.mjs +244 -0
  197. package/dist/esm/tools/BrowserTools.mjs.map +1 -0
  198. package/dist/esm/tools/Calculator.mjs +41 -0
  199. package/dist/esm/tools/Calculator.mjs.map +1 -0
  200. package/dist/esm/tools/CodeExecutor.mjs +226 -0
  201. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  202. package/dist/esm/tools/ProgrammaticToolCalling.mjs +622 -0
  203. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -0
  204. package/dist/esm/tools/ToolNode.mjs +545 -0
  205. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  206. package/dist/esm/tools/ToolSearch.mjs +870 -0
  207. package/dist/esm/tools/ToolSearch.mjs.map +1 -0
  208. package/dist/esm/tools/handlers.mjs +250 -0
  209. package/dist/esm/tools/handlers.mjs.map +1 -0
  210. package/dist/esm/tools/schema.mjs +28 -0
  211. package/dist/esm/tools/schema.mjs.map +1 -0
  212. package/dist/esm/tools/search/anthropic.mjs +37 -0
  213. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  214. package/dist/esm/tools/search/content.mjs +119 -0
  215. package/dist/esm/tools/search/content.mjs.map +1 -0
  216. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  217. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  218. package/dist/esm/tools/search/format.mjs +201 -0
  219. package/dist/esm/tools/search/format.mjs.map +1 -0
  220. package/dist/esm/tools/search/highlights.mjs +243 -0
  221. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  222. package/dist/esm/tools/search/rerankers.mjs +168 -0
  223. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  224. package/dist/esm/tools/search/schema.mjs +104 -0
  225. package/dist/esm/tools/search/schema.mjs.map +1 -0
  226. package/dist/esm/tools/search/search.mjs +563 -0
  227. package/dist/esm/tools/search/search.mjs.map +1 -0
  228. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  229. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  230. package/dist/esm/tools/search/tool.mjs +454 -0
  231. package/dist/esm/tools/search/tool.mjs.map +1 -0
  232. package/dist/esm/tools/search/utils.mjs +61 -0
  233. package/dist/esm/tools/search/utils.mjs.map +1 -0
  234. package/dist/esm/types/graph.mjs +26 -0
  235. package/dist/esm/types/graph.mjs.map +1 -0
  236. package/dist/esm/utils/contextAnalytics.mjs +64 -0
  237. package/dist/esm/utils/contextAnalytics.mjs.map +1 -0
  238. package/dist/esm/utils/events.mjs +29 -0
  239. package/dist/esm/utils/events.mjs.map +1 -0
  240. package/dist/esm/utils/graph.mjs +13 -0
  241. package/dist/esm/utils/graph.mjs.map +1 -0
  242. package/dist/esm/utils/handlers.mjs +68 -0
  243. package/dist/esm/utils/handlers.mjs.map +1 -0
  244. package/dist/esm/utils/llm.mjs +24 -0
  245. package/dist/esm/utils/llm.mjs.map +1 -0
  246. package/dist/esm/utils/misc.mjs +53 -0
  247. package/dist/esm/utils/misc.mjs.map +1 -0
  248. package/dist/esm/utils/run.mjs +70 -0
  249. package/dist/esm/utils/run.mjs.map +1 -0
  250. package/dist/esm/utils/schema.mjs +24 -0
  251. package/dist/esm/utils/schema.mjs.map +1 -0
  252. package/dist/esm/utils/title.mjs +122 -0
  253. package/dist/esm/utils/title.mjs.map +1 -0
  254. package/dist/esm/utils/tokens.mjs +121 -0
  255. package/dist/esm/utils/tokens.mjs.map +1 -0
  256. package/dist/esm/utils/toonFormat.mjs +381 -0
  257. package/dist/esm/utils/toonFormat.mjs.map +1 -0
  258. package/dist/types/agents/AgentContext.d.ts +293 -0
  259. package/dist/types/common/enum.d.ts +155 -0
  260. package/dist/types/common/index.d.ts +1 -0
  261. package/dist/types/events.d.ts +31 -0
  262. package/dist/types/graphs/Graph.d.ts +216 -0
  263. package/dist/types/graphs/MultiAgentGraph.d.ts +104 -0
  264. package/dist/types/graphs/index.d.ts +2 -0
  265. package/dist/types/index.d.ts +21 -0
  266. package/dist/types/instrumentation.d.ts +1 -0
  267. package/dist/types/llm/anthropic/index.d.ts +39 -0
  268. package/dist/types/llm/anthropic/types.d.ts +37 -0
  269. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  270. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  271. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  272. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  273. package/dist/types/llm/bedrock/index.d.ts +141 -0
  274. package/dist/types/llm/bedrock/types.d.ts +27 -0
  275. package/dist/types/llm/bedrock/utils/index.d.ts +5 -0
  276. package/dist/types/llm/bedrock/utils/message_inputs.d.ts +31 -0
  277. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +33 -0
  278. package/dist/types/llm/fake.d.ts +31 -0
  279. package/dist/types/llm/google/index.d.ts +24 -0
  280. package/dist/types/llm/google/types.d.ts +42 -0
  281. package/dist/types/llm/google/utils/common.d.ts +34 -0
  282. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  283. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  284. package/dist/types/llm/openai/index.d.ts +127 -0
  285. package/dist/types/llm/openai/types.d.ts +10 -0
  286. package/dist/types/llm/openai/utils/index.d.ts +29 -0
  287. package/dist/types/llm/openrouter/index.d.ts +15 -0
  288. package/dist/types/llm/providers.d.ts +5 -0
  289. package/dist/types/llm/text.d.ts +21 -0
  290. package/dist/types/llm/vertexai/index.d.ts +293 -0
  291. package/dist/types/messages/cache.d.ts +54 -0
  292. package/dist/types/messages/content.d.ts +7 -0
  293. package/dist/types/messages/core.d.ts +14 -0
  294. package/dist/types/messages/format.d.ts +137 -0
  295. package/dist/types/messages/ids.d.ts +3 -0
  296. package/dist/types/messages/index.d.ts +7 -0
  297. package/dist/types/messages/prune.d.ts +52 -0
  298. package/dist/types/messages/reducer.d.ts +9 -0
  299. package/dist/types/messages/tools.d.ts +17 -0
  300. package/dist/types/mockStream.d.ts +32 -0
  301. package/dist/types/prompts/collab.d.ts +1 -0
  302. package/dist/types/prompts/index.d.ts +2 -0
  303. package/dist/types/prompts/taskmanager.d.ts +41 -0
  304. package/dist/types/run.d.ts +41 -0
  305. package/dist/types/schemas/index.d.ts +1 -0
  306. package/dist/types/schemas/validate.d.ts +59 -0
  307. package/dist/types/splitStream.d.ts +37 -0
  308. package/dist/types/stream.d.ts +15 -0
  309. package/dist/types/test/mockTools.d.ts +28 -0
  310. package/dist/types/tools/BrowserTools.d.ts +87 -0
  311. package/dist/types/tools/Calculator.d.ts +34 -0
  312. package/dist/types/tools/CodeExecutor.d.ts +57 -0
  313. package/dist/types/tools/ProgrammaticToolCalling.d.ts +138 -0
  314. package/dist/types/tools/ToolNode.d.ts +51 -0
  315. package/dist/types/tools/ToolSearch.d.ts +219 -0
  316. package/dist/types/tools/handlers.d.ts +22 -0
  317. package/dist/types/tools/schema.d.ts +12 -0
  318. package/dist/types/tools/search/anthropic.d.ts +16 -0
  319. package/dist/types/tools/search/content.d.ts +4 -0
  320. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  321. package/dist/types/tools/search/format.d.ts +5 -0
  322. package/dist/types/tools/search/highlights.d.ts +13 -0
  323. package/dist/types/tools/search/index.d.ts +3 -0
  324. package/dist/types/tools/search/rerankers.d.ts +38 -0
  325. package/dist/types/tools/search/schema.d.ts +103 -0
  326. package/dist/types/tools/search/search.d.ts +8 -0
  327. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  328. package/dist/types/tools/search/test.d.ts +1 -0
  329. package/dist/types/tools/search/tool.d.ts +3 -0
  330. package/dist/types/tools/search/types.d.ts +575 -0
  331. package/dist/types/tools/search/utils.d.ts +10 -0
  332. package/dist/types/types/graph.d.ts +399 -0
  333. package/dist/types/types/index.d.ts +5 -0
  334. package/dist/types/types/llm.d.ts +105 -0
  335. package/dist/types/types/messages.d.ts +4 -0
  336. package/dist/types/types/run.d.ts +112 -0
  337. package/dist/types/types/stream.d.ts +308 -0
  338. package/dist/types/types/tools.d.ts +296 -0
  339. package/dist/types/utils/contextAnalytics.d.ts +37 -0
  340. package/dist/types/utils/events.d.ts +6 -0
  341. package/dist/types/utils/graph.d.ts +2 -0
  342. package/dist/types/utils/handlers.d.ts +34 -0
  343. package/dist/types/utils/index.d.ts +9 -0
  344. package/dist/types/utils/llm.d.ts +3 -0
  345. package/dist/types/utils/llmConfig.d.ts +3 -0
  346. package/dist/types/utils/logging.d.ts +1 -0
  347. package/dist/types/utils/misc.d.ts +7 -0
  348. package/dist/types/utils/run.d.ts +27 -0
  349. package/dist/types/utils/schema.d.ts +8 -0
  350. package/dist/types/utils/title.d.ts +4 -0
  351. package/dist/types/utils/tokens.d.ts +28 -0
  352. package/dist/types/utils/toonFormat.d.ts +111 -0
  353. package/package.json +190 -0
  354. package/src/agents/AgentContext.test.ts +458 -0
  355. package/src/agents/AgentContext.ts +972 -0
  356. package/src/agents/__tests__/AgentContext.test.ts +805 -0
  357. package/src/agents/__tests__/resolveStructuredOutputMode.test.ts +137 -0
  358. package/src/common/enum.ts +203 -0
  359. package/src/common/index.ts +2 -0
  360. package/src/events.ts +223 -0
  361. package/src/graphs/Graph.ts +2228 -0
  362. package/src/graphs/MultiAgentGraph.ts +1063 -0
  363. package/src/graphs/__tests__/structured-output.integration.test.ts +809 -0
  364. package/src/graphs/__tests__/structured-output.test.ts +183 -0
  365. package/src/graphs/index.ts +2 -0
  366. package/src/index.ts +34 -0
  367. package/src/instrumentation.ts +22 -0
  368. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  369. package/src/llm/anthropic/index.ts +413 -0
  370. package/src/llm/anthropic/llm.spec.ts +1442 -0
  371. package/src/llm/anthropic/types.ts +140 -0
  372. package/src/llm/anthropic/utils/message_inputs.ts +757 -0
  373. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  374. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  375. package/src/llm/anthropic/utils/tools.ts +29 -0
  376. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +495 -0
  377. package/src/llm/bedrock/index.ts +411 -0
  378. package/src/llm/bedrock/llm.spec.ts +616 -0
  379. package/src/llm/bedrock/types.ts +51 -0
  380. package/src/llm/bedrock/utils/index.ts +18 -0
  381. package/src/llm/bedrock/utils/message_inputs.ts +563 -0
  382. package/src/llm/bedrock/utils/message_outputs.ts +310 -0
  383. package/src/llm/fake.ts +133 -0
  384. package/src/llm/google/data/gettysburg10.wav +0 -0
  385. package/src/llm/google/data/hotdog.jpg +0 -0
  386. package/src/llm/google/index.ts +337 -0
  387. package/src/llm/google/llm.spec.ts +934 -0
  388. package/src/llm/google/types.ts +56 -0
  389. package/src/llm/google/utils/common.ts +873 -0
  390. package/src/llm/google/utils/tools.ts +160 -0
  391. package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
  392. package/src/llm/openai/index.ts +1366 -0
  393. package/src/llm/openai/types.ts +24 -0
  394. package/src/llm/openai/utils/index.ts +1035 -0
  395. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  396. package/src/llm/openrouter/index.ts +291 -0
  397. package/src/llm/providers.ts +52 -0
  398. package/src/llm/text.ts +94 -0
  399. package/src/llm/vertexai/index.ts +359 -0
  400. package/src/messages/__tests__/tools.test.ts +473 -0
  401. package/src/messages/cache.test.ts +1261 -0
  402. package/src/messages/cache.ts +518 -0
  403. package/src/messages/content.test.ts +362 -0
  404. package/src/messages/content.ts +63 -0
  405. package/src/messages/core.ts +473 -0
  406. package/src/messages/ensureThinkingBlock.test.ts +468 -0
  407. package/src/messages/format.ts +1029 -0
  408. package/src/messages/formatAgentMessages.test.ts +1513 -0
  409. package/src/messages/formatAgentMessages.tools.test.ts +419 -0
  410. package/src/messages/formatMessage.test.ts +693 -0
  411. package/src/messages/ids.ts +26 -0
  412. package/src/messages/index.ts +7 -0
  413. package/src/messages/labelContentByAgent.test.ts +887 -0
  414. package/src/messages/prune.ts +568 -0
  415. package/src/messages/reducer.ts +80 -0
  416. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  417. package/src/messages/tools.ts +108 -0
  418. package/src/mockStream.ts +99 -0
  419. package/src/prompts/collab.ts +6 -0
  420. package/src/prompts/index.ts +2 -0
  421. package/src/prompts/taskmanager.ts +61 -0
  422. package/src/run.ts +467 -0
  423. package/src/schemas/index.ts +2 -0
  424. package/src/schemas/schema-preparation.test.ts +500 -0
  425. package/src/schemas/validate.test.ts +358 -0
  426. package/src/schemas/validate.ts +454 -0
  427. package/src/scripts/abort.ts +157 -0
  428. package/src/scripts/ant_web_search.ts +158 -0
  429. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  430. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  431. package/src/scripts/args.ts +48 -0
  432. package/src/scripts/caching.ts +132 -0
  433. package/src/scripts/cli.ts +172 -0
  434. package/src/scripts/cli2.ts +133 -0
  435. package/src/scripts/cli3.ts +184 -0
  436. package/src/scripts/cli4.ts +191 -0
  437. package/src/scripts/cli5.ts +191 -0
  438. package/src/scripts/code_exec.ts +213 -0
  439. package/src/scripts/code_exec_files.ts +236 -0
  440. package/src/scripts/code_exec_multi_session.ts +241 -0
  441. package/src/scripts/code_exec_ptc.ts +334 -0
  442. package/src/scripts/code_exec_session.ts +282 -0
  443. package/src/scripts/code_exec_simple.ts +147 -0
  444. package/src/scripts/content.ts +138 -0
  445. package/src/scripts/empty_input.ts +137 -0
  446. package/src/scripts/handoff-test.ts +135 -0
  447. package/src/scripts/image.ts +178 -0
  448. package/src/scripts/memory.ts +97 -0
  449. package/src/scripts/multi-agent-chain.ts +331 -0
  450. package/src/scripts/multi-agent-conditional.ts +221 -0
  451. package/src/scripts/multi-agent-document-review-chain.ts +197 -0
  452. package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
  453. package/src/scripts/multi-agent-parallel-start.ts +265 -0
  454. package/src/scripts/multi-agent-parallel.ts +394 -0
  455. package/src/scripts/multi-agent-sequence.ts +217 -0
  456. package/src/scripts/multi-agent-supervisor.ts +365 -0
  457. package/src/scripts/multi-agent-test.ts +186 -0
  458. package/src/scripts/parallel-asymmetric-tools-test.ts +274 -0
  459. package/src/scripts/parallel-full-metadata-test.ts +240 -0
  460. package/src/scripts/parallel-tools-test.ts +340 -0
  461. package/src/scripts/programmatic_exec.ts +396 -0
  462. package/src/scripts/programmatic_exec_agent.ts +231 -0
  463. package/src/scripts/search.ts +146 -0
  464. package/src/scripts/sequential-full-metadata-test.ts +197 -0
  465. package/src/scripts/simple.ts +225 -0
  466. package/src/scripts/single-agent-metadata-test.ts +198 -0
  467. package/src/scripts/stream.ts +140 -0
  468. package/src/scripts/test-custom-prompt-key.ts +145 -0
  469. package/src/scripts/test-handoff-input.ts +170 -0
  470. package/src/scripts/test-handoff-preamble.ts +277 -0
  471. package/src/scripts/test-multi-agent-list-handoff.ts +417 -0
  472. package/src/scripts/test-parallel-agent-labeling.ts +325 -0
  473. package/src/scripts/test-parallel-handoffs.ts +291 -0
  474. package/src/scripts/test-thinking-handoff-bedrock.ts +153 -0
  475. package/src/scripts/test-thinking-handoff.ts +155 -0
  476. package/src/scripts/test-tools-before-handoff.ts +226 -0
  477. package/src/scripts/test_code_api.ts +361 -0
  478. package/src/scripts/thinking-bedrock.ts +159 -0
  479. package/src/scripts/thinking.ts +171 -0
  480. package/src/scripts/tool_search.ts +162 -0
  481. package/src/scripts/tools.ts +177 -0
  482. package/src/specs/agent-handoffs.test.ts +888 -0
  483. package/src/specs/anthropic.simple.test.ts +387 -0
  484. package/src/specs/azure.simple.test.ts +364 -0
  485. package/src/specs/cache.simple.test.ts +396 -0
  486. package/src/specs/deepseek.simple.test.ts +283 -0
  487. package/src/specs/emergency-prune.test.ts +407 -0
  488. package/src/specs/moonshot.simple.test.ts +358 -0
  489. package/src/specs/openai.simple.test.ts +311 -0
  490. package/src/specs/openrouter.simple.test.ts +107 -0
  491. package/src/specs/prune.test.ts +901 -0
  492. package/src/specs/reasoning.test.ts +201 -0
  493. package/src/specs/spec.utils.ts +3 -0
  494. package/src/specs/thinking-handoff.test.ts +620 -0
  495. package/src/specs/thinking-prune.test.ts +703 -0
  496. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  497. package/src/specs/token-memoization.test.ts +32 -0
  498. package/src/specs/tool-error.test.ts +198 -0
  499. package/src/splitStream.test.ts +691 -0
  500. package/src/splitStream.ts +234 -0
  501. package/src/stream.test.ts +94 -0
  502. package/src/stream.ts +801 -0
  503. package/src/test/mockTools.ts +386 -0
  504. package/src/tools/BrowserTools.ts +393 -0
  505. package/src/tools/Calculator.test.ts +278 -0
  506. package/src/tools/Calculator.ts +46 -0
  507. package/src/tools/CodeExecutor.ts +270 -0
  508. package/src/tools/ProgrammaticToolCalling.ts +785 -0
  509. package/src/tools/ToolNode.ts +674 -0
  510. package/src/tools/ToolSearch.ts +1095 -0
  511. package/src/tools/__tests__/BrowserTools.test.ts +265 -0
  512. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +319 -0
  513. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +1006 -0
  514. package/src/tools/__tests__/ToolSearch.integration.test.ts +162 -0
  515. package/src/tools/__tests__/ToolSearch.test.ts +1003 -0
  516. package/src/tools/handlers.ts +363 -0
  517. package/src/tools/schema.ts +37 -0
  518. package/src/tools/search/anthropic.ts +51 -0
  519. package/src/tools/search/content.test.ts +173 -0
  520. package/src/tools/search/content.ts +147 -0
  521. package/src/tools/search/firecrawl.ts +210 -0
  522. package/src/tools/search/format.ts +250 -0
  523. package/src/tools/search/highlights.ts +320 -0
  524. package/src/tools/search/index.ts +3 -0
  525. package/src/tools/search/jina-reranker.test.ts +130 -0
  526. package/src/tools/search/output.md +2775 -0
  527. package/src/tools/search/rerankers.ts +242 -0
  528. package/src/tools/search/schema.ts +113 -0
  529. package/src/tools/search/search.ts +768 -0
  530. package/src/tools/search/serper-scraper.ts +155 -0
  531. package/src/tools/search/test.html +884 -0
  532. package/src/tools/search/test.md +643 -0
  533. package/src/tools/search/test.ts +159 -0
  534. package/src/tools/search/tool.ts +657 -0
  535. package/src/tools/search/types.ts +665 -0
  536. package/src/tools/search/utils.ts +79 -0
  537. package/src/types/graph.test.ts +218 -0
  538. package/src/types/graph.ts +533 -0
  539. package/src/types/index.ts +6 -0
  540. package/src/types/llm.ts +140 -0
  541. package/src/types/messages.ts +4 -0
  542. package/src/types/run.ts +128 -0
  543. package/src/types/stream.ts +417 -0
  544. package/src/types/tools.ts +355 -0
  545. package/src/utils/contextAnalytics.ts +103 -0
  546. package/src/utils/events.ts +32 -0
  547. package/src/utils/graph.ts +11 -0
  548. package/src/utils/handlers.ts +107 -0
  549. package/src/utils/index.ts +9 -0
  550. package/src/utils/llm.ts +26 -0
  551. package/src/utils/llmConfig.ts +208 -0
  552. package/src/utils/logging.ts +48 -0
  553. package/src/utils/misc.ts +57 -0
  554. package/src/utils/run.ts +106 -0
  555. package/src/utils/schema.ts +35 -0
  556. package/src/utils/title.ts +177 -0
  557. package/src/utils/tokens.ts +142 -0
  558. package/src/utils/toonFormat.ts +475 -0
@@ -0,0 +1,518 @@
1
+ import { BaseMessage, MessageContentComplex } from '@langchain/core/messages';
2
+ import type { AnthropicMessage } from '@/types/messages';
3
+ import type Anthropic from '@anthropic-ai/sdk';
4
+ import { ContentTypes } from '@/common/enum';
5
+
6
+ type MessageWithContent = {
7
+ content?: string | MessageContentComplex[];
8
+ };
9
+
10
+ /** Debug logger for cache operations - set ILLUMA_DEBUG_CACHE=true to enable */
11
+ const debugCache = (message: string, data?: unknown): void => {
12
+ if (process.env.ILLUMA_DEBUG_CACHE === 'true') {
13
+ // eslint-disable-next-line no-console
14
+ console.log(
15
+ `[Cache] ${message}`,
16
+ data !== undefined ? JSON.stringify(data, null, 2) : ''
17
+ );
18
+ }
19
+ };
20
+
21
+ /**
22
+ * Deep clones a message's content to prevent mutation of the original.
23
+ */
24
+ function deepCloneContent<T extends string | MessageContentComplex[]>(
25
+ content: T
26
+ ): T {
27
+ if (typeof content === 'string') {
28
+ return content;
29
+ }
30
+ if (Array.isArray(content)) {
31
+ return content.map((block) => ({ ...block })) as T;
32
+ }
33
+ return content;
34
+ }
35
+
36
+ /**
37
+ * Clones a message with deep-cloned content, explicitly excluding LangChain
38
+ * serialization metadata to prevent coercion issues.
39
+ * Keeps lc_kwargs in sync with content to prevent LangChain serialization issues.
40
+ */
41
+ function cloneMessage<T extends MessageWithContent>(
42
+ message: T,
43
+ content: string | MessageContentComplex[]
44
+ ): T {
45
+ const {
46
+ lc_kwargs: _lc_kwargs,
47
+ lc_serializable: _lc_serializable,
48
+ lc_namespace: _lc_namespace,
49
+ ...rest
50
+ } = message as T & {
51
+ lc_kwargs?: unknown;
52
+ lc_serializable?: unknown;
53
+ lc_namespace?: unknown;
54
+ };
55
+
56
+ const cloned = { ...rest, content } as T;
57
+
58
+ // Sync lc_kwargs.content with the new content to prevent LangChain coercion issues
59
+ const lcKwargs = (message as Record<string, unknown>).lc_kwargs as
60
+ | Record<string, unknown>
61
+ | undefined;
62
+ if (lcKwargs != null) {
63
+ (cloned as Record<string, unknown>).lc_kwargs = {
64
+ ...lcKwargs,
65
+ content: content,
66
+ };
67
+ }
68
+
69
+ // LangChain messages don't have a direct 'role' property - derive it from getType()
70
+ if (
71
+ 'getType' in message &&
72
+ typeof message.getType === 'function' &&
73
+ !('role' in cloned)
74
+ ) {
75
+ const msgType = (message as unknown as BaseMessage).getType();
76
+ const roleMap: Record<string, string> = {
77
+ human: 'user',
78
+ ai: 'assistant',
79
+ system: 'system',
80
+ tool: 'tool',
81
+ };
82
+ (cloned as Record<string, unknown>).role = roleMap[msgType] || msgType;
83
+ }
84
+
85
+ return cloned;
86
+ }
87
+
88
+ /**
89
+ * Checks if a content block is a cache point
90
+ */
91
+ function isCachePoint(block: MessageContentComplex): boolean {
92
+ return 'cachePoint' in block && !('type' in block);
93
+ }
94
+
95
+ /**
96
+ * Checks if a message's content needs cache control stripping.
97
+ * Returns true if content has cachePoint blocks or cache_control fields.
98
+ */
99
+ function needsCacheStripping(content: MessageContentComplex[]): boolean {
100
+ for (let i = 0; i < content.length; i++) {
101
+ const block = content[i];
102
+ if (isCachePoint(block)) return true;
103
+ if ('cache_control' in block) return true;
104
+ }
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * Checks if a message's content has Anthropic cache_control fields.
110
+ */
111
+ function hasAnthropicCacheControl(content: MessageContentComplex[]): boolean {
112
+ for (let i = 0; i < content.length; i++) {
113
+ if ('cache_control' in content[i]) return true;
114
+ }
115
+ return false;
116
+ }
117
+
118
+ /**
119
+ * Checks if a message's content has Bedrock cachePoint blocks.
120
+ */
121
+ function hasBedrockCachePoint(content: MessageContentComplex[]): boolean {
122
+ for (let i = 0; i < content.length; i++) {
123
+ if (isCachePoint(content[i])) return true;
124
+ }
125
+ return false;
126
+ }
127
+
128
+ /**
129
+ * Anthropic API: Adds cache control to the appropriate user messages in the payload.
130
+ * Strips ALL existing cache control (both Anthropic and Bedrock formats) from all messages,
131
+ * then adds fresh cache control to the last 2 user messages in a single backward pass.
132
+ * This ensures we don't accumulate stale cache points across multiple turns.
133
+ * Returns a new array - only clones messages that require modification.
134
+ * @param messages - The array of message objects.
135
+ * @returns - A new array of message objects with cache control added.
136
+ */
137
+ export function addCacheControl<T extends AnthropicMessage | BaseMessage>(
138
+ messages: T[]
139
+ ): T[] {
140
+ if (!Array.isArray(messages) || messages.length < 2) {
141
+ return messages;
142
+ }
143
+
144
+ const updatedMessages: T[] = [...messages];
145
+ let userMessagesModified = 0;
146
+
147
+ for (let i = updatedMessages.length - 1; i >= 0; i--) {
148
+ const originalMessage = updatedMessages[i];
149
+ const content = originalMessage.content;
150
+ const isUserMessage =
151
+ ('getType' in originalMessage && originalMessage.getType() === 'human') ||
152
+ ('role' in originalMessage && originalMessage.role === 'user');
153
+
154
+ const hasArrayContent = Array.isArray(content);
155
+ const needsStripping =
156
+ hasArrayContent &&
157
+ needsCacheStripping(content as MessageContentComplex[]);
158
+ const needsCacheAdd =
159
+ userMessagesModified < 2 &&
160
+ isUserMessage &&
161
+ (typeof content === 'string' || hasArrayContent);
162
+
163
+ if (!needsStripping && !needsCacheAdd) {
164
+ continue;
165
+ }
166
+
167
+ let workingContent: MessageContentComplex[];
168
+
169
+ if (hasArrayContent) {
170
+ workingContent = deepCloneContent(
171
+ content as MessageContentComplex[]
172
+ ).filter((block) => !isCachePoint(block as MessageContentComplex));
173
+
174
+ for (let j = 0; j < workingContent.length; j++) {
175
+ const block = workingContent[j] as Record<string, unknown>;
176
+ if ('cache_control' in block) {
177
+ delete block.cache_control;
178
+ }
179
+ }
180
+ } else if (typeof content === 'string') {
181
+ workingContent = [
182
+ { type: 'text', text: content },
183
+ ] as MessageContentComplex[];
184
+ } else {
185
+ workingContent = [];
186
+ }
187
+
188
+ if (userMessagesModified >= 2 || !isUserMessage) {
189
+ updatedMessages[i] = cloneMessage(
190
+ originalMessage as MessageWithContent,
191
+ workingContent
192
+ ) as T;
193
+ continue;
194
+ }
195
+
196
+ for (let j = workingContent.length - 1; j >= 0; j--) {
197
+ const contentPart = workingContent[j];
198
+ if ('type' in contentPart && contentPart.type === 'text') {
199
+ (contentPart as Anthropic.TextBlockParam).cache_control = {
200
+ type: 'ephemeral',
201
+ };
202
+ userMessagesModified++;
203
+ break;
204
+ }
205
+ }
206
+
207
+ updatedMessages[i] = cloneMessage(
208
+ originalMessage as MessageWithContent,
209
+ workingContent
210
+ ) as T;
211
+ }
212
+
213
+ return updatedMessages;
214
+ }
215
+
216
+ /**
217
+ * Removes all Anthropic cache_control fields from messages
218
+ * Used when switching from Anthropic to Bedrock provider
219
+ * Returns a new array - only clones messages that require modification.
220
+ */
221
+ export function stripAnthropicCacheControl<T extends MessageWithContent>(
222
+ messages: T[]
223
+ ): T[] {
224
+ if (!Array.isArray(messages)) {
225
+ return messages;
226
+ }
227
+
228
+ const updatedMessages: T[] = [...messages];
229
+
230
+ for (let i = 0; i < updatedMessages.length; i++) {
231
+ const originalMessage = updatedMessages[i];
232
+ const content = originalMessage.content;
233
+
234
+ if (!Array.isArray(content) || !hasAnthropicCacheControl(content)) {
235
+ continue;
236
+ }
237
+
238
+ const clonedContent = deepCloneContent(content);
239
+ for (let j = 0; j < clonedContent.length; j++) {
240
+ const block = clonedContent[j] as Record<string, unknown>;
241
+ if ('cache_control' in block) {
242
+ delete block.cache_control;
243
+ }
244
+ }
245
+ updatedMessages[i] = cloneMessage(originalMessage, clonedContent) as T;
246
+ }
247
+
248
+ return updatedMessages;
249
+ }
250
+
251
+ /**
252
+ * Removes all Bedrock cachePoint blocks from messages
253
+ * Used when switching from Bedrock to Anthropic provider
254
+ * Returns a new array - only clones messages that require modification.
255
+ */
256
+ export function stripBedrockCacheControl<T extends MessageWithContent>(
257
+ messages: T[]
258
+ ): T[] {
259
+ if (!Array.isArray(messages)) {
260
+ return messages;
261
+ }
262
+
263
+ const updatedMessages: T[] = [...messages];
264
+
265
+ for (let i = 0; i < updatedMessages.length; i++) {
266
+ const originalMessage = updatedMessages[i];
267
+ const content = originalMessage.content;
268
+
269
+ if (!Array.isArray(content) || !hasBedrockCachePoint(content)) {
270
+ continue;
271
+ }
272
+
273
+ const clonedContent = deepCloneContent(content).filter(
274
+ (block) => !isCachePoint(block as MessageContentComplex)
275
+ );
276
+ updatedMessages[i] = cloneMessage(originalMessage, clonedContent) as T;
277
+ }
278
+
279
+ return updatedMessages;
280
+ }
281
+
282
+ /**
283
+ * Adds Bedrock Converse API cache points using "Stable Prefix Caching" strategy.
284
+ *
285
+ * STRATEGY: Place cache point after the LAST ASSISTANT message only.
286
+ * This ensures the prefix (everything before the cache point) remains STABLE
287
+ * as the conversation grows, maximizing cache hits.
288
+ *
289
+ * Why this works:
290
+ * - System message has its own cachePoint (added in AgentContext)
291
+ * - Tools have their own cachePoint (added in CustomChatBedrockConverse)
292
+ * - Conversation history grows, but the PREFIX stays the same
293
+ * - Only the NEW user message is uncached (it's always different)
294
+ *
295
+ * Example conversation flow:
296
+ * Request 1: [System+cachePoint][Tools+cachePoint][User1] → No conversation cache yet
297
+ * Request 2: [System][Tools][User1][Assistant1+cachePoint][User2] → Cache User1+Assistant1
298
+ * Request 3: [System][Tools][User1][Assistant1][User2][Assistant2+cachePoint][User3]
299
+ * → Cache reads User1+A1+User2+A2, cache writes new portion
300
+ *
301
+ * Claude's "Simplified Cache Management" automatically looks back up to 20 content
302
+ * blocks from the cache checkpoint to find the longest matching prefix.
303
+ *
304
+ * @param messages - The array of message objects (excluding system message).
305
+ * @returns - The updated array with a single cache point after the last assistant message.
306
+ */
307
+ export function addBedrockCacheControl<
308
+ T extends Partial<BaseMessage> & MessageWithContent,
309
+ >(messages: T[]): T[] {
310
+ if (!Array.isArray(messages) || messages.length < 1) {
311
+ debugCache('addBedrockCacheControl: Skipping - no messages', {
312
+ count: messages.length,
313
+ });
314
+ return messages;
315
+ }
316
+
317
+ debugCache(
318
+ 'addBedrockCacheControl: Processing messages with stable prefix strategy',
319
+ {
320
+ count: messages.length,
321
+ }
322
+ );
323
+
324
+ const updatedMessages: T[] = messages.slice();
325
+
326
+ // First pass: Remove ALL existing cache points to ensure clean state
327
+ // This prevents accumulation of stale cache points
328
+ for (const message of updatedMessages) {
329
+ const content = message.content;
330
+ if (Array.isArray(content)) {
331
+ message.content = content.filter(
332
+ (block) => !isCachePoint(block)
333
+ ) as typeof content;
334
+
335
+ // Also remove Anthropic-style cache_control
336
+ for (let j = 0; j < message.content.length; j++) {
337
+ const block = message.content[j] as Record<string, unknown>;
338
+ if ('cache_control' in block) {
339
+ delete block.cache_control;
340
+ }
341
+ }
342
+ }
343
+ }
344
+
345
+ // Helper function to check if a message contains reasoning/thinking blocks
346
+ const hasReasoningBlock = (message: T): boolean => {
347
+ const content = message.content;
348
+ if (!Array.isArray(content)) {
349
+ return false;
350
+ }
351
+ for (const block of content) {
352
+ const type = (block as { type?: string }).type;
353
+ // Check for all reasoning/thinking block types:
354
+ // - reasoning_content: Bedrock Anthropic extended thinking
355
+ // - reasoning: Generic reasoning format
356
+ // - thinking: Anthropic direct API thinking
357
+ // - redacted_thinking: Anthropic redacted thinking blocks
358
+ if (
359
+ type === 'reasoning_content' ||
360
+ type === 'reasoning' ||
361
+ type === 'thinking' ||
362
+ type === 'redacted_thinking'
363
+ ) {
364
+ return true;
365
+ }
366
+ }
367
+ return false;
368
+ };
369
+
370
+ // Second pass: Find the LAST assistant message WITHOUT reasoning blocks and add a cache point there
371
+ // Messages with reasoning/thinking blocks cannot have cache points after them (Bedrock limitation)
372
+ let lastAssistantIndex = -1;
373
+ let skippedWithReasoning = 0;
374
+
375
+ // Count message types for logging
376
+ const messageTypes: Record<string, number> = {};
377
+ for (const message of updatedMessages) {
378
+ const msgType =
379
+ 'getType' in message && typeof message.getType === 'function'
380
+ ? message.getType()
381
+ : 'unknown';
382
+ messageTypes[msgType] = (messageTypes[msgType] || 0) + 1;
383
+ }
384
+
385
+ for (let i = updatedMessages.length - 1; i >= 0; i--) {
386
+ const message = updatedMessages[i];
387
+ const messageType =
388
+ 'getType' in message && typeof message.getType === 'function'
389
+ ? message.getType()
390
+ : 'unknown';
391
+
392
+ if (messageType === 'ai') {
393
+ // Skip assistant messages with reasoning blocks - cache points not allowed after them
394
+ if (hasReasoningBlock(message)) {
395
+ skippedWithReasoning++;
396
+ debugCache(
397
+ 'addBedrockCacheControl: Skipping assistant message with reasoning block',
398
+ { index: i }
399
+ );
400
+ continue;
401
+ }
402
+ lastAssistantIndex = i;
403
+ break;
404
+ }
405
+ }
406
+
407
+ // Log message summary
408
+ debugCache(
409
+ `📨 Messages | total=${updatedMessages.length} | ${Object.entries(
410
+ messageTypes
411
+ )
412
+ .map(([k, v]) => `${k}:${v}`)
413
+ .join(' ')} | skippedReasoning=${skippedWithReasoning}`
414
+ );
415
+
416
+ // If no suitable assistant message found, skip conversation caching
417
+ // (System and Tools caching are still handled separately)
418
+ if (lastAssistantIndex === -1) {
419
+ debugCache(
420
+ '📨 Messages | No suitable assistant message for cachePoint (first turn or all have reasoning)'
421
+ );
422
+ return updatedMessages;
423
+ }
424
+
425
+ // Add cache point to the last assistant message (without reasoning blocks)
426
+ const assistantMessage = updatedMessages[lastAssistantIndex];
427
+ const content = assistantMessage.content;
428
+
429
+ if (typeof content === 'string' && content !== '') {
430
+ assistantMessage.content = [
431
+ { type: ContentTypes.TEXT, text: content },
432
+ { cachePoint: { type: 'default' } },
433
+ ] as MessageContentComplex[];
434
+ debugCache(
435
+ `📍 Message cachePoint at index ${lastAssistantIndex} (string, ${content.length} chars)`
436
+ );
437
+ debugCache(
438
+ 'addBedrockCacheControl: Added cachePoint to assistant message (string content)',
439
+ {
440
+ index: lastAssistantIndex,
441
+ contentLength: content.length,
442
+ }
443
+ );
444
+ } else if (
445
+ Array.isArray(assistantMessage.content) &&
446
+ assistantMessage.content.length > 0
447
+ ) {
448
+ // Double-check: If this message has reasoning blocks, skip adding cache point entirely
449
+ // This handles edge cases where the initial skip check might have missed it
450
+ if (hasReasoningBlock(assistantMessage)) {
451
+ debugCache(
452
+ `⚠️ Message cachePoint SKIPPED at index ${lastAssistantIndex} (has reasoning blocks)`
453
+ );
454
+ debugCache(
455
+ 'addBedrockCacheControl: Skipping - assistant message has reasoning blocks (safety check)',
456
+ {
457
+ index: lastAssistantIndex,
458
+ }
459
+ );
460
+ return updatedMessages;
461
+ }
462
+
463
+ // Find the last text block and insert cache point after it
464
+ let inserted = false;
465
+ for (let j = assistantMessage.content.length - 1; j >= 0; j--) {
466
+ const block = assistantMessage.content[j] as MessageContentComplex;
467
+ const type = (block as { type?: string }).type;
468
+ if (type === ContentTypes.TEXT || type === 'text') {
469
+ const text = (block as { text?: string }).text;
470
+ if (text != null && text !== '') {
471
+ assistantMessage.content.splice(j + 1, 0, {
472
+ cachePoint: { type: 'default' },
473
+ } as MessageContentComplex);
474
+ inserted = true;
475
+ debugCache(
476
+ `📍 Message cachePoint at index ${lastAssistantIndex} (array, block ${j}, ${text.length} chars)`
477
+ );
478
+ debugCache(
479
+ 'addBedrockCacheControl: Added cachePoint after text block in assistant message',
480
+ {
481
+ index: lastAssistantIndex,
482
+ textBlockIndex: j,
483
+ contentLength: text.length,
484
+ }
485
+ );
486
+ break;
487
+ }
488
+ }
489
+ }
490
+
491
+ // If no text block found, don't append cache point as the message structure is unexpected
492
+ if (!inserted) {
493
+ const contentTypes = assistantMessage.content.map(
494
+ (b) => (b as { type?: string }).type
495
+ );
496
+ debugCache(
497
+ `⚠️ Message cachePoint SKIPPED at index ${lastAssistantIndex} (no text block, types: ${contentTypes.join(',')})`
498
+ );
499
+ debugCache(
500
+ 'addBedrockCacheControl: No suitable text block found, skipping cache point',
501
+ {
502
+ index: lastAssistantIndex,
503
+ contentTypes,
504
+ }
505
+ );
506
+ }
507
+ }
508
+
509
+ debugCache(
510
+ 'addBedrockCacheControl: Complete - stable prefix caching applied',
511
+ {
512
+ lastAssistantIndex,
513
+ totalMessages: updatedMessages.length,
514
+ }
515
+ );
516
+
517
+ return updatedMessages;
518
+ }