@illuma-ai/agents 1.5.0 → 2.1.1

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 (424) hide show
  1. package/README.md +0 -62
  2. package/dist/cjs/agents/AgentContext.cjs +159 -258
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +25 -8
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -5
  7. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  8. package/dist/cjs/llm/bedrock/index.cjs +33 -61
  9. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  10. package/dist/cjs/llm/openai/utils/index.cjs +10 -27
  11. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  12. package/dist/cjs/main.cjs +3 -84
  13. package/dist/cjs/main.cjs.map +1 -1
  14. package/dist/cjs/messages/cache.cjs +0 -89
  15. package/dist/cjs/messages/cache.cjs.map +1 -1
  16. package/dist/cjs/messages/format.cjs +10 -68
  17. package/dist/cjs/messages/format.cjs.map +1 -1
  18. package/dist/cjs/tools/BashExecutor.cjs +11 -21
  19. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  20. package/dist/cjs/tools/CodeExecutor.cjs +10 -37
  21. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  22. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +11 -16
  23. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  24. package/dist/cjs/tools/ToolNode.cjs +73 -8
  25. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  26. package/dist/cjs/tools/search/search.cjs +3 -11
  27. package/dist/cjs/tools/search/search.cjs.map +1 -1
  28. package/dist/cjs/tools/search/tool.cjs +4 -28
  29. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  30. package/dist/cjs/tools/search/utils.cjs +3 -10
  31. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  32. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +48 -0
  33. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  34. package/dist/cjs/types/graph.cjs.map +1 -1
  35. package/dist/esm/agents/AgentContext.mjs +159 -258
  36. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  37. package/dist/esm/graphs/Graph.mjs +25 -8
  38. package/dist/esm/graphs/Graph.mjs.map +1 -1
  39. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -5
  40. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  41. package/dist/esm/llm/bedrock/index.mjs +34 -61
  42. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  43. package/dist/esm/llm/openai/utils/index.mjs +10 -27
  44. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  45. package/dist/esm/main.mjs +1 -5
  46. package/dist/esm/main.mjs.map +1 -1
  47. package/dist/esm/messages/cache.mjs +0 -89
  48. package/dist/esm/messages/cache.mjs.map +1 -1
  49. package/dist/esm/messages/format.mjs +10 -68
  50. package/dist/esm/messages/format.mjs.map +1 -1
  51. package/dist/esm/tools/BashExecutor.mjs +12 -22
  52. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  53. package/dist/esm/tools/CodeExecutor.mjs +11 -37
  54. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  55. package/dist/esm/tools/ProgrammaticToolCalling.mjs +12 -17
  56. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  57. package/dist/esm/tools/ToolNode.mjs +73 -8
  58. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  59. package/dist/esm/tools/search/search.mjs +3 -11
  60. package/dist/esm/tools/search/search.mjs.map +1 -1
  61. package/dist/esm/tools/search/tool.mjs +4 -28
  62. package/dist/esm/tools/search/tool.mjs.map +1 -1
  63. package/dist/esm/tools/search/utils.mjs +3 -10
  64. package/dist/esm/tools/search/utils.mjs.map +1 -1
  65. package/dist/esm/tools/subagent/SubagentExecutor.mjs +48 -0
  66. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  67. package/dist/esm/types/graph.mjs.map +1 -1
  68. package/dist/types/agents/AgentContext.d.ts +25 -95
  69. package/dist/types/index.d.ts +0 -1
  70. package/dist/types/llm/bedrock/index.d.ts +1 -54
  71. package/dist/types/messages/format.d.ts +1 -4
  72. package/dist/types/tools/CodeExecutor.d.ts +0 -6
  73. package/dist/types/tools/search/types.d.ts +5 -99
  74. package/dist/types/tools/search/utils.d.ts +2 -2
  75. package/dist/types/tools/subagent/SubagentExecutor.d.ts +29 -0
  76. package/dist/types/types/graph.d.ts +24 -27
  77. package/dist/types/types/index.d.ts +0 -1
  78. package/dist/types/types/run.d.ts +0 -2
  79. package/dist/types/types/tools.d.ts +0 -9
  80. package/package.json +1 -61
  81. package/src/agents/AgentContext.test.ts +176 -0
  82. package/src/agents/AgentContext.ts +178 -304
  83. package/src/agents/__tests__/AgentContext.test.ts +0 -632
  84. package/src/graphs/Graph.ts +27 -8
  85. package/src/index.ts +0 -6
  86. package/src/llm/anthropic/utils/message_inputs.ts +1 -10
  87. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +18 -166
  88. package/src/llm/bedrock/index.ts +41 -116
  89. package/src/llm/openai/utils/index.ts +14 -31
  90. package/src/messages/cache.test.ts +24 -62
  91. package/src/messages/cache.ts +0 -112
  92. package/src/messages/format.ts +10 -89
  93. package/src/scripts/subagent-configurable-inheritance.ts +263 -0
  94. package/src/specs/anthropic.simple.test.ts +0 -61
  95. package/src/tools/BashExecutor.ts +13 -37
  96. package/src/tools/CodeExecutor.ts +11 -55
  97. package/src/tools/ProgrammaticToolCalling.ts +14 -29
  98. package/src/tools/ToolNode.ts +69 -8
  99. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -60
  100. package/src/tools/__tests__/SubagentExecutor.test.ts +157 -0
  101. package/src/tools/search/search.ts +2 -12
  102. package/src/tools/search/tool.ts +2 -36
  103. package/src/tools/search/types.ts +8 -133
  104. package/src/tools/search/utils.ts +5 -13
  105. package/src/tools/subagent/SubagentExecutor.ts +78 -0
  106. package/src/types/graph.ts +21 -27
  107. package/src/types/index.ts +0 -1
  108. package/src/types/run.ts +0 -2
  109. package/src/types/tools.ts +0 -9
  110. package/dist/cjs/langchain/google-common.cjs +0 -3
  111. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  112. package/dist/cjs/langchain/index.cjs +0 -86
  113. package/dist/cjs/langchain/index.cjs.map +0 -1
  114. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  115. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  116. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  117. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  118. package/dist/cjs/langchain/messages.cjs +0 -51
  119. package/dist/cjs/langchain/messages.cjs.map +0 -1
  120. package/dist/cjs/langchain/openai.cjs +0 -3
  121. package/dist/cjs/langchain/openai.cjs.map +0 -1
  122. package/dist/cjs/langchain/prompts.cjs +0 -11
  123. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  124. package/dist/cjs/langchain/runnables.cjs +0 -19
  125. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  126. package/dist/cjs/langchain/tools.cjs +0 -23
  127. package/dist/cjs/langchain/tools.cjs.map +0 -1
  128. package/dist/cjs/langchain/utils/env.cjs +0 -11
  129. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  130. package/dist/cjs/llm/bedrock/cacheSupport.cjs +0 -55
  131. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +0 -1
  132. package/dist/cjs/tools/search/tavily-scraper.cjs +0 -189
  133. package/dist/cjs/tools/search/tavily-scraper.cjs.map +0 -1
  134. package/dist/cjs/tools/search/tavily-search.cjs +0 -372
  135. package/dist/cjs/tools/search/tavily-search.cjs.map +0 -1
  136. package/dist/cjs/types/agent-cache.cjs +0 -53
  137. package/dist/cjs/types/agent-cache.cjs.map +0 -1
  138. package/dist/esm/langchain/google-common.mjs +0 -2
  139. package/dist/esm/langchain/google-common.mjs.map +0 -1
  140. package/dist/esm/langchain/index.mjs +0 -5
  141. package/dist/esm/langchain/index.mjs.map +0 -1
  142. package/dist/esm/langchain/language_models/chat_models.mjs +0 -2
  143. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  144. package/dist/esm/langchain/messages/tool.mjs +0 -2
  145. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  146. package/dist/esm/langchain/messages.mjs +0 -2
  147. package/dist/esm/langchain/messages.mjs.map +0 -1
  148. package/dist/esm/langchain/openai.mjs +0 -2
  149. package/dist/esm/langchain/openai.mjs.map +0 -1
  150. package/dist/esm/langchain/prompts.mjs +0 -2
  151. package/dist/esm/langchain/prompts.mjs.map +0 -1
  152. package/dist/esm/langchain/runnables.mjs +0 -2
  153. package/dist/esm/langchain/runnables.mjs.map +0 -1
  154. package/dist/esm/langchain/tools.mjs +0 -2
  155. package/dist/esm/langchain/tools.mjs.map +0 -1
  156. package/dist/esm/langchain/utils/env.mjs +0 -2
  157. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  158. package/dist/esm/llm/bedrock/cacheSupport.mjs +0 -52
  159. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +0 -1
  160. package/dist/esm/tools/search/tavily-scraper.mjs +0 -186
  161. package/dist/esm/tools/search/tavily-scraper.mjs.map +0 -1
  162. package/dist/esm/tools/search/tavily-search.mjs +0 -370
  163. package/dist/esm/tools/search/tavily-search.mjs.map +0 -1
  164. package/dist/esm/types/agent-cache.mjs +0 -51
  165. package/dist/esm/types/agent-cache.mjs.map +0 -1
  166. package/dist/types/langchain/google-common.d.ts +0 -1
  167. package/dist/types/langchain/index.d.ts +0 -8
  168. package/dist/types/langchain/language_models/chat_models.d.ts +0 -1
  169. package/dist/types/langchain/messages/tool.d.ts +0 -1
  170. package/dist/types/langchain/messages.d.ts +0 -2
  171. package/dist/types/langchain/openai.d.ts +0 -1
  172. package/dist/types/langchain/prompts.d.ts +0 -1
  173. package/dist/types/langchain/runnables.d.ts +0 -2
  174. package/dist/types/langchain/tools.d.ts +0 -2
  175. package/dist/types/langchain/utils/env.d.ts +0 -1
  176. package/dist/types/llm/bedrock/cacheSupport.d.ts +0 -35
  177. package/dist/types/tools/search/tavily-scraper.d.ts +0 -19
  178. package/dist/types/tools/search/tavily-search.d.ts +0 -4
  179. package/dist/types/tools/subagent/types.d.ts +0 -84
  180. package/dist/types/types/agent-cache.d.ts +0 -70
  181. package/src/agents/AgentContext.js.map +0 -1
  182. package/src/agents/AgentContext.test.js.map +0 -1
  183. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +0 -259
  184. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +0 -264
  185. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +0 -342
  186. package/src/agents/__tests__/AgentContext.test.js.map +0 -1
  187. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +0 -1
  188. package/src/common/enum.js.map +0 -1
  189. package/src/common/index.js.map +0 -1
  190. package/src/events.js.map +0 -1
  191. package/src/graphs/Graph.js.map +0 -1
  192. package/src/graphs/MultiAgentGraph.js.map +0 -1
  193. package/src/graphs/__tests__/structured-output.integration.test.js.map +0 -1
  194. package/src/graphs/__tests__/structured-output.test.js.map +0 -1
  195. package/src/graphs/contextManagement.e2e.test.js.map +0 -1
  196. package/src/graphs/contextManagement.test.js.map +0 -1
  197. package/src/graphs/handoffValidation.test.js.map +0 -1
  198. package/src/graphs/index.js.map +0 -1
  199. package/src/index.js.map +0 -1
  200. package/src/instrumentation.js.map +0 -1
  201. package/src/langchain/google-common.ts +0 -1
  202. package/src/langchain/index.ts +0 -8
  203. package/src/langchain/language_models/chat_models.ts +0 -1
  204. package/src/langchain/messages/tool.ts +0 -5
  205. package/src/langchain/messages.ts +0 -21
  206. package/src/langchain/openai.ts +0 -1
  207. package/src/langchain/prompts.ts +0 -1
  208. package/src/langchain/runnables.ts +0 -7
  209. package/src/langchain/tools.ts +0 -8
  210. package/src/langchain/utils/env.ts +0 -1
  211. package/src/llm/anthropic/index.js.map +0 -1
  212. package/src/llm/anthropic/types.js.map +0 -1
  213. package/src/llm/anthropic/utils/message_inputs.js.map +0 -1
  214. package/src/llm/anthropic/utils/message_outputs.js.map +0 -1
  215. package/src/llm/anthropic/utils/output_parsers.js.map +0 -1
  216. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -436
  217. package/src/llm/anthropic/utils/tools.js.map +0 -1
  218. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +0 -1
  219. package/src/llm/bedrock/cacheSupport.test.ts +0 -99
  220. package/src/llm/bedrock/cacheSupport.ts +0 -53
  221. package/src/llm/bedrock/index.js.map +0 -1
  222. package/src/llm/bedrock/types.js.map +0 -1
  223. package/src/llm/bedrock/utils/index.js.map +0 -1
  224. package/src/llm/bedrock/utils/message_inputs.js.map +0 -1
  225. package/src/llm/bedrock/utils/message_outputs.js.map +0 -1
  226. package/src/llm/fake.js.map +0 -1
  227. package/src/llm/google/index.js.map +0 -1
  228. package/src/llm/google/types.js.map +0 -1
  229. package/src/llm/google/utils/common.js.map +0 -1
  230. package/src/llm/google/utils/tools.js.map +0 -1
  231. package/src/llm/google/utils/zod_to_genai_parameters.js.map +0 -1
  232. package/src/llm/openai/index.js.map +0 -1
  233. package/src/llm/openai/types.js.map +0 -1
  234. package/src/llm/openai/utils/index.js.map +0 -1
  235. package/src/llm/openai/utils/isReasoningModel.test.js.map +0 -1
  236. package/src/llm/openrouter/index.js.map +0 -1
  237. package/src/llm/openrouter/reasoning.test.js.map +0 -1
  238. package/src/llm/providers.js.map +0 -1
  239. package/src/llm/text.js.map +0 -1
  240. package/src/llm/vertexai/index.js.map +0 -1
  241. package/src/messages/__tests__/tools.test.js.map +0 -1
  242. package/src/messages/cache.js.map +0 -1
  243. package/src/messages/cache.test.js.map +0 -1
  244. package/src/messages/content.js.map +0 -1
  245. package/src/messages/content.test.js.map +0 -1
  246. package/src/messages/core.js.map +0 -1
  247. package/src/messages/ensureThinkingBlock.test.js.map +0 -1
  248. package/src/messages/format.js.map +0 -1
  249. package/src/messages/formatAgentMessages.test.js.map +0 -1
  250. package/src/messages/formatAgentMessages.tools.test.js.map +0 -1
  251. package/src/messages/formatMessage.test.js.map +0 -1
  252. package/src/messages/ids.js.map +0 -1
  253. package/src/messages/index.js.map +0 -1
  254. package/src/messages/labelContentByAgent.test.js.map +0 -1
  255. package/src/messages/prune.js.map +0 -1
  256. package/src/messages/reducer.js.map +0 -1
  257. package/src/messages/shiftIndexTokenCountMap.test.js.map +0 -1
  258. package/src/messages/summarize.js.map +0 -1
  259. package/src/messages/summarize.test.js.map +0 -1
  260. package/src/messages/tools.js.map +0 -1
  261. package/src/mockStream.js.map +0 -1
  262. package/src/prompts/collab.js.map +0 -1
  263. package/src/prompts/index.js.map +0 -1
  264. package/src/prompts/taskmanager.js.map +0 -1
  265. package/src/run.js.map +0 -1
  266. package/src/schemas/index.js.map +0 -1
  267. package/src/schemas/schema-preparation.test.js.map +0 -1
  268. package/src/schemas/validate.js.map +0 -1
  269. package/src/schemas/validate.test.js.map +0 -1
  270. package/src/scripts/abort.js.map +0 -1
  271. package/src/scripts/ant_web_search.js.map +0 -1
  272. package/src/scripts/ant_web_search_edge_case.js.map +0 -1
  273. package/src/scripts/ant_web_search_error_edge_case.js.map +0 -1
  274. package/src/scripts/args.js.map +0 -1
  275. package/src/scripts/bedrock-cache-debug.js.map +0 -1
  276. package/src/scripts/bedrock-content-aggregation-test.js.map +0 -1
  277. package/src/scripts/bedrock-merge-test.js.map +0 -1
  278. package/src/scripts/bedrock-parallel-tools-test.js.map +0 -1
  279. package/src/scripts/caching.js.map +0 -1
  280. package/src/scripts/cli.js.map +0 -1
  281. package/src/scripts/cli2.js.map +0 -1
  282. package/src/scripts/cli3.js.map +0 -1
  283. package/src/scripts/cli4.js.map +0 -1
  284. package/src/scripts/cli5.js.map +0 -1
  285. package/src/scripts/code_exec.js.map +0 -1
  286. package/src/scripts/code_exec_files.js.map +0 -1
  287. package/src/scripts/code_exec_multi_session.js.map +0 -1
  288. package/src/scripts/code_exec_ptc.js.map +0 -1
  289. package/src/scripts/code_exec_session.js.map +0 -1
  290. package/src/scripts/code_exec_simple.js.map +0 -1
  291. package/src/scripts/content.js.map +0 -1
  292. package/src/scripts/empty_input.js.map +0 -1
  293. package/src/scripts/handoff-test.js.map +0 -1
  294. package/src/scripts/image.js.map +0 -1
  295. package/src/scripts/memory.js.map +0 -1
  296. package/src/scripts/multi-agent-chain.js.map +0 -1
  297. package/src/scripts/multi-agent-conditional.js.map +0 -1
  298. package/src/scripts/multi-agent-document-review-chain.js.map +0 -1
  299. package/src/scripts/multi-agent-hybrid-flow.js.map +0 -1
  300. package/src/scripts/multi-agent-parallel-start.js.map +0 -1
  301. package/src/scripts/multi-agent-parallel.js.map +0 -1
  302. package/src/scripts/multi-agent-sequence.js.map +0 -1
  303. package/src/scripts/multi-agent-supervisor.js.map +0 -1
  304. package/src/scripts/multi-agent-test.js.map +0 -1
  305. package/src/scripts/parallel-asymmetric-tools-test.js.map +0 -1
  306. package/src/scripts/parallel-full-metadata-test.js.map +0 -1
  307. package/src/scripts/parallel-tools-test.js.map +0 -1
  308. package/src/scripts/programmatic_exec.js.map +0 -1
  309. package/src/scripts/programmatic_exec_agent.js.map +0 -1
  310. package/src/scripts/search.js.map +0 -1
  311. package/src/scripts/sequential-full-metadata-test.js.map +0 -1
  312. package/src/scripts/simple.js.map +0 -1
  313. package/src/scripts/single-agent-metadata-test.js.map +0 -1
  314. package/src/scripts/stream.js.map +0 -1
  315. package/src/scripts/test-custom-prompt-key.js.map +0 -1
  316. package/src/scripts/test-handoff-input.js.map +0 -1
  317. package/src/scripts/test-handoff-preamble.js.map +0 -1
  318. package/src/scripts/test-handoff-steering.js.map +0 -1
  319. package/src/scripts/test-multi-agent-list-handoff.js.map +0 -1
  320. package/src/scripts/test-parallel-agent-labeling.js.map +0 -1
  321. package/src/scripts/test-parallel-handoffs.js.map +0 -1
  322. package/src/scripts/test-thinking-handoff-bedrock.js.map +0 -1
  323. package/src/scripts/test-thinking-handoff.js.map +0 -1
  324. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +0 -1
  325. package/src/scripts/test-tool-before-handoff-role-order.js.map +0 -1
  326. package/src/scripts/test-tools-before-handoff.js.map +0 -1
  327. package/src/scripts/test_code_api.js.map +0 -1
  328. package/src/scripts/thinking-bedrock.js.map +0 -1
  329. package/src/scripts/thinking-vertexai.js.map +0 -1
  330. package/src/scripts/thinking.js.map +0 -1
  331. package/src/scripts/tool_search.js.map +0 -1
  332. package/src/scripts/tools.js.map +0 -1
  333. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +0 -1
  334. package/src/specs/agent-handoffs.test.js.map +0 -1
  335. package/src/specs/anthropic.simple.test.js.map +0 -1
  336. package/src/specs/azure.simple.test.js.map +0 -1
  337. package/src/specs/cache.simple.test.js.map +0 -1
  338. package/src/specs/custom-event-await.test.js.map +0 -1
  339. package/src/specs/deepseek.simple.test.js.map +0 -1
  340. package/src/specs/emergency-prune.test.js.map +0 -1
  341. package/src/specs/moonshot.simple.test.js.map +0 -1
  342. package/src/specs/observability.integration.test.js.map +0 -1
  343. package/src/specs/openai.simple.test.js.map +0 -1
  344. package/src/specs/openrouter.simple.test.js.map +0 -1
  345. package/src/specs/prune.test.js.map +0 -1
  346. package/src/specs/reasoning.test.js.map +0 -1
  347. package/src/specs/spec.utils.js.map +0 -1
  348. package/src/specs/thinking-handoff.test.js.map +0 -1
  349. package/src/specs/thinking-prune.test.js.map +0 -1
  350. package/src/specs/token-distribution-edge-case.test.js.map +0 -1
  351. package/src/specs/token-memoization.test.js.map +0 -1
  352. package/src/specs/tokens.test.js.map +0 -1
  353. package/src/specs/tool-error.test.js.map +0 -1
  354. package/src/splitStream.js.map +0 -1
  355. package/src/splitStream.test.js.map +0 -1
  356. package/src/stream.js.map +0 -1
  357. package/src/stream.test.js.map +0 -1
  358. package/src/test/mockTools.js.map +0 -1
  359. package/src/tools/BrowserTools.js.map +0 -1
  360. package/src/tools/Calculator.js.map +0 -1
  361. package/src/tools/Calculator.test.js.map +0 -1
  362. package/src/tools/CodeExecutor.js.map +0 -1
  363. package/src/tools/ProgrammaticToolCalling.js.map +0 -1
  364. package/src/tools/StreamingToolCallBuffer.js.map +0 -1
  365. package/src/tools/ToolNode.js.map +0 -1
  366. package/src/tools/ToolSearch.js.map +0 -1
  367. package/src/tools/__tests__/BrowserTools.test.js.map +0 -1
  368. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +0 -1
  369. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +0 -1
  370. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +0 -1
  371. package/src/tools/__tests__/ToolApproval.test.js.map +0 -1
  372. package/src/tools/__tests__/ToolNode.recovery.test.js.map +0 -1
  373. package/src/tools/__tests__/ToolNode.session.test.js.map +0 -1
  374. package/src/tools/__tests__/ToolSearch.integration.test.js.map +0 -1
  375. package/src/tools/__tests__/ToolSearch.test.js.map +0 -1
  376. package/src/tools/__tests__/handlers.test.js.map +0 -1
  377. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +0 -1
  378. package/src/tools/handlers.js.map +0 -1
  379. package/src/tools/schema.js.map +0 -1
  380. package/src/tools/search/anthropic.js.map +0 -1
  381. package/src/tools/search/content.js.map +0 -1
  382. package/src/tools/search/content.test.js.map +0 -1
  383. package/src/tools/search/firecrawl.js.map +0 -1
  384. package/src/tools/search/format.js.map +0 -1
  385. package/src/tools/search/highlights.js.map +0 -1
  386. package/src/tools/search/index.js.map +0 -1
  387. package/src/tools/search/jina-reranker.test.js.map +0 -1
  388. package/src/tools/search/rerankers.js.map +0 -1
  389. package/src/tools/search/schema.js.map +0 -1
  390. package/src/tools/search/search.js.map +0 -1
  391. package/src/tools/search/serper-scraper.js.map +0 -1
  392. package/src/tools/search/tavily-scraper.ts +0 -235
  393. package/src/tools/search/tavily-search.ts +0 -424
  394. package/src/tools/search/tavily.test.ts +0 -965
  395. package/src/tools/search/test.js.map +0 -1
  396. package/src/tools/search/tool.js.map +0 -1
  397. package/src/tools/search/types.js.map +0 -1
  398. package/src/tools/search/utils.js.map +0 -1
  399. package/src/tools/subagent/types.test.ts +0 -70
  400. package/src/tools/subagent/types.ts +0 -115
  401. package/src/types/agent-cache.ts +0 -73
  402. package/src/types/graph.js.map +0 -1
  403. package/src/types/graph.test.js.map +0 -1
  404. package/src/types/index.js.map +0 -1
  405. package/src/types/llm.js.map +0 -1
  406. package/src/types/messages.js.map +0 -1
  407. package/src/types/run.js.map +0 -1
  408. package/src/types/stream.js.map +0 -1
  409. package/src/types/tools.js.map +0 -1
  410. package/src/utils/contextAnalytics.js.map +0 -1
  411. package/src/utils/contextAnalytics.test.js.map +0 -1
  412. package/src/utils/events.js.map +0 -1
  413. package/src/utils/graph.js.map +0 -1
  414. package/src/utils/handlers.js.map +0 -1
  415. package/src/utils/index.js.map +0 -1
  416. package/src/utils/llm.js.map +0 -1
  417. package/src/utils/llmConfig.js.map +0 -1
  418. package/src/utils/logging.js.map +0 -1
  419. package/src/utils/misc.js.map +0 -1
  420. package/src/utils/run.js.map +0 -1
  421. package/src/utils/schema.js.map +0 -1
  422. package/src/utils/title.js.map +0 -1
  423. package/src/utils/tokens.js.map +0 -1
  424. package/src/utils/toonFormat.js.map +0 -1
package/src/index.ts CHANGED
@@ -78,12 +78,6 @@ export * from './utils';
78
78
  /* Types */
79
79
  export type * from './types';
80
80
 
81
- /* LangChain compatibility facade — re-exports common langchain primitives
82
- * so consumers can import from '@illuma-ai/agents/langchain' instead of
83
- * pinning '@langchain/*' versions directly. Helps keep consumer dep
84
- * versions in sync with the library's tested set. */
85
- export * from './langchain';
86
-
87
81
  /* LLM */
88
82
  export { CustomOpenAIClient } from './llm/openai';
89
83
  export { ChatOpenRouter } from './llm/openrouter';
@@ -592,16 +592,7 @@ function _formatContent(message: BaseMessage) {
592
592
  throw new Error('Unsupported message content format');
593
593
  }
594
594
  });
595
- return contentBlocks.filter(
596
- (block) =>
597
- block !== null &&
598
- !(
599
- block.type === 'text' &&
600
- 'text' in block &&
601
- typeof block.text === 'string' &&
602
- block.text.trim() === ''
603
- )
604
- );
595
+ return contentBlocks.filter((block) => block !== null);
605
596
  }
606
597
  }
607
598
 
@@ -194,134 +194,6 @@ describe('Bedrock Prompt Caching', () => {
194
194
  expect(model.promptCache).toBe(false);
195
195
  });
196
196
  });
197
-
198
- describe('Tool cache strategies', () => {
199
- const fakeTools = [
200
- {
201
- toolSpec: {
202
- name: 'web_search',
203
- description: 'core search',
204
- inputSchema: { json: { type: 'object', properties: {} } },
205
- },
206
- },
207
- {
208
- toolSpec: {
209
- name: 'execute_code',
210
- description: 'core code',
211
- inputSchema: { json: { type: 'object', properties: {} } },
212
- },
213
- },
214
- {
215
- toolSpec: {
216
- name: 'search_emails_mcp_Outlook',
217
- description: 'mcp tool',
218
- inputSchema: { json: { type: 'object', properties: {} } },
219
- },
220
- },
221
- {
222
- toolSpec: {
223
- name: 'list_documents_mcp_SharePoint',
224
- description: 'mcp tool',
225
- inputSchema: { json: { type: 'object', properties: {} } },
226
- },
227
- },
228
- ];
229
-
230
- it("default 'single' strategy: one cachePoint at end of tools array", () => {
231
- const model = new CustomChatBedrockConverse({
232
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
233
- region: 'us-east-1',
234
- promptCache: true,
235
- // toolCacheStrategy omitted — default is 'single'
236
- });
237
- const params = model.invocationParams({
238
- tools: fakeTools,
239
- } satisfies InvocationParamsOptions);
240
- // 4 tools + 1 cachePoint
241
- expect(params.toolConfig?.tools).toHaveLength(5);
242
- expect(params.toolConfig?.tools?.[4]).toEqual({
243
- cachePoint: { type: 'default' },
244
- });
245
- });
246
-
247
- it("'split' strategy with toolGroupSelector groups tools by selector key, cachePoint after each group", () => {
248
- const model = new CustomChatBedrockConverse({
249
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
250
- region: 'us-east-1',
251
- promptCache: true,
252
- toolCacheStrategy: 'split',
253
- toolGroupSelector: (toolName) =>
254
- toolName.includes('_mcp_') ? 'mcp' : 'core',
255
- });
256
- const params = model.invocationParams({
257
- tools: fakeTools,
258
- } satisfies InvocationParamsOptions);
259
- // [core, core, cp, mcp, mcp, cp] = 6 entries
260
- expect(params.toolConfig?.tools).toHaveLength(6);
261
- expect(params.toolConfig?.tools?.[0]).toEqual(fakeTools[0]); // core
262
- expect(params.toolConfig?.tools?.[1]).toEqual(fakeTools[1]); // core
263
- expect(params.toolConfig?.tools?.[2]).toEqual({
264
- cachePoint: { type: 'default' },
265
- });
266
- expect(params.toolConfig?.tools?.[3]).toEqual(fakeTools[2]); // mcp
267
- expect(params.toolConfig?.tools?.[4]).toEqual(fakeTools[3]); // mcp
268
- expect(params.toolConfig?.tools?.[5]).toEqual({
269
- cachePoint: { type: 'default' },
270
- });
271
- });
272
-
273
- it("'none' strategy: no cachePoint added at all", () => {
274
- const model = new CustomChatBedrockConverse({
275
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
276
- region: 'us-east-1',
277
- promptCache: true,
278
- toolCacheStrategy: 'none',
279
- });
280
- const params = model.invocationParams({
281
- tools: fakeTools,
282
- } satisfies InvocationParamsOptions);
283
- expect(params.toolConfig?.tools).toHaveLength(4);
284
- for (const tool of params.toolConfig?.tools ?? []) {
285
- expect('cachePoint' in tool).toBe(false);
286
- }
287
- });
288
-
289
- it("'split' with single-group selector behaves like 'single'", () => {
290
- const model = new CustomChatBedrockConverse({
291
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
292
- region: 'us-east-1',
293
- promptCache: true,
294
- toolCacheStrategy: 'split',
295
- toolGroupSelector: () => 'all', // every tool same group
296
- });
297
- const params = model.invocationParams({
298
- tools: fakeTools,
299
- } satisfies InvocationParamsOptions);
300
- // 4 tools + 1 cachePoint
301
- expect(params.toolConfig?.tools).toHaveLength(5);
302
- expect(params.toolConfig?.tools?.[4]).toEqual({
303
- cachePoint: { type: 'default' },
304
- });
305
- });
306
-
307
- it("'split' with empty groups skipped (only emits cachePoint after non-empty groups)", () => {
308
- const model = new CustomChatBedrockConverse({
309
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
310
- region: 'us-east-1',
311
- promptCache: true,
312
- toolCacheStrategy: 'split',
313
- toolGroupSelector: (name) =>
314
- name.includes('_mcp_') ? 'mcp' : 'core',
315
- });
316
- // Only core tools — no MCP
317
- const coreOnly = fakeTools.slice(0, 2);
318
- const params = model.invocationParams({
319
- tools: coreOnly,
320
- } satisfies InvocationParamsOptions);
321
- // 2 core + 1 cachePoint = 3
322
- expect(params.toolConfig?.tools).toHaveLength(3);
323
- });
324
- });
325
197
  });
326
198
 
327
199
  describe('AgentContext - System Message Caching', () => {
@@ -361,13 +233,7 @@ describe('Bedrock Prompt Caching', () => {
361
233
  };
362
234
 
363
235
  describe('Bedrock system message with promptCache: true', () => {
364
- /* Updated contract (2026-05-01, upstream PR #128 alignment): Bedrock
365
- * system message gets a `cachePoint` block inline so the system
366
- * prefix is cached at the AWS account level (cross-user). Previously
367
- * cachePoint was only added at the tool level, leaving the system
368
- * prefix uncached. Tools array still gets its own cachePoints from
369
- * IllumaBedrockConverse.invocationParams independently. */
370
- it('emits content array with cachePoint after stable text (Claude model)', async () => {
236
+ it('should produce plain string system message (cachePoint is handled at tool level)', async () => {
371
237
  const ctx = createBedrockContext({
372
238
  instructions: 'You are a helpful assistant.',
373
239
  promptCache: true,
@@ -376,20 +242,17 @@ describe('Bedrock Prompt Caching', () => {
376
242
  const systemRunnable = ctx.systemRunnable;
377
243
  expect(systemRunnable).toBeDefined();
378
244
 
245
+ // Invoke the runnable to get the messages
379
246
  const result = await systemRunnable!.invoke([]);
380
247
  const systemMessage = result[0];
381
248
 
382
- const content = systemMessage.content as Array<Record<string, unknown>>;
383
- expect(Array.isArray(content)).toBe(true);
384
- expect(content).toHaveLength(2);
385
- expect(content[0]).toEqual({
386
- type: 'text',
387
- text: 'You are a helpful assistant.',
388
- });
389
- expect(content[1]).toEqual({ cachePoint: { type: 'default', ttl: '5m' } });
249
+ // Bedrock system messages are plain strings — cachePoint is added
250
+ // at the tool level by IllumaBedrockConverse.invocationParams()
251
+ expect(typeof systemMessage.content).toBe('string');
252
+ expect(systemMessage.content).toBe('You are a helpful assistant.');
390
253
  });
391
254
 
392
- it('keeps additional_instructions AFTER cachePoint (dynamic tail not cached)', async () => {
255
+ it('should include combined instructions and additional_instructions as plain string', async () => {
393
256
  const ctx = createBedrockContext({
394
257
  instructions: 'Base instructions.',
395
258
  additionalInstructions: 'Additional context.',
@@ -398,20 +261,11 @@ describe('Bedrock Prompt Caching', () => {
398
261
 
399
262
  const result = await ctx.systemRunnable!.invoke([]);
400
263
  const systemMessage = result[0];
401
- const content = systemMessage.content as Array<Record<string, unknown>>;
402
264
 
403
- /* Order is critical: stable text cachePoint dynamic text.
404
- * Anything after the cachePoint is excluded from the cache, so
405
- * the per-user/per-request `additional_instructions` does not
406
- * invalidate the cached prefix. */
407
- expect(content).toHaveLength(3);
408
- expect((content[0] as { text: string }).text).toBe(
409
- 'Base instructions.'
410
- );
411
- expect(content[1]).toEqual({ cachePoint: { type: 'default', ttl: '5m' } });
412
- expect((content[2] as { text: string }).text).toBe(
413
- 'Additional context.'
414
- );
265
+ // Bedrock system messages are plain strings even with promptCache
266
+ expect(typeof systemMessage.content).toBe('string');
267
+ expect(systemMessage.content).toContain('Base instructions.');
268
+ expect(systemMessage.content).toContain('Additional context.');
415
269
  });
416
270
  });
417
271
 
@@ -458,7 +312,7 @@ describe('Bedrock Prompt Caching', () => {
458
312
  expect(content[0]).toEqual({
459
313
  type: 'text',
460
314
  text: 'You are a helpful assistant.',
461
- cache_control: { type: 'ephemeral', ttl: '5m' },
315
+ cache_control: { type: 'ephemeral' },
462
316
  });
463
317
  });
464
318
 
@@ -476,21 +330,19 @@ describe('Bedrock Prompt Caching', () => {
476
330
  });
477
331
 
478
332
  describe('Provider-specific caching behavior', () => {
479
- it('emits cachePoint block inline for Bedrock Claude (account-scoped system caching)', async () => {
333
+ it('should produce plain string for Bedrock (cachePoint handled at tool level)', async () => {
480
334
  const bedrockCtx = createBedrockContext({
481
335
  instructions: 'Test',
482
336
  promptCache: true,
483
337
  });
484
338
 
485
339
  const result = await bedrockCtx.systemRunnable!.invoke([]);
486
- const content = result[0].content as Array<Record<string, unknown>>;
487
340
 
488
- // Bedrock system messages now carry an inline cachePoint so the
489
- // system prefix gets cached at the AWS account level (matching
490
- // upstream PR #128). Tool-level cachePoint from
491
- // IllumaBedrockConverse.invocationParams() runs independently.
492
- expect(Array.isArray(content)).toBe(true);
493
- expect(content.some((c) => 'cachePoint' in c)).toBe(true);
341
+ // Bedrock system messages are plain strings cachePoint is added
342
+ // at the tool level by IllumaBedrockConverse.invocationParams(),
343
+ // not inline in the system message content
344
+ expect(typeof result[0].content).toBe('string');
345
+ expect(result[0].content).toBe('Test');
494
346
  });
495
347
 
496
348
  it('should use cache_control format for Anthropic, not cachePoint', async () => {
@@ -38,7 +38,6 @@ import type { BaseMessage } from '@langchain/core/messages';
38
38
  import { ChatGenerationChunk, ChatResult } from '@langchain/core/outputs';
39
39
  import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
40
40
  import type { ChatBedrockConverseInput } from '@langchain/aws';
41
- import { isBedrockCacheSupported } from './cacheSupport';
42
41
  import {
43
42
  convertToConverseMessages,
44
43
  handleConverseStreamContentBlockStart,
@@ -53,72 +52,19 @@ import {
53
52
  */
54
53
  export type ServiceTierType = 'priority' | 'default' | 'flex' | 'reserved';
55
54
 
56
- /**
57
- * Tool cachePoint allocation strategy.
58
- *
59
- * - 'single': one cachePoint at the END of the tools array (whole array
60
- * cached as one unit). Lightest budget use (1 cachePoint).
61
- * - 'split': split tools into groups via `toolGroupSelector`. Each
62
- * non-empty group gets its own cachePoint. Use when groups
63
- * have different volatility (e.g. stable core tools vs
64
- * volatile MCP tools). Costs more cachePoint budget.
65
- * - 'none': no cachePoint on tools array. Use when tool definitions
66
- * change every request anyway.
67
- */
68
- export type ToolCacheStrategy = 'single' | 'split' | 'none';
69
-
70
- /**
71
- * Group selector for `toolCacheStrategy: 'split'`. Receives the tool name
72
- * and returns a stable group key — tools with the same key are grouped
73
- * together. Group order in the output array follows first-encounter order.
74
- */
75
- export type ToolGroupSelector = (toolName: string) => string;
76
-
77
- /**
78
- * Default group selector — puts all tools in a single group named 'core'.
79
- * Equivalent to 'single' strategy but explicit. Consumers override this
80
- * to enable per-source grouping (e.g. ranger uses `_mcp_` substring to
81
- * separate core from MCP tools).
82
- */
83
- export const DEFAULT_TOOL_GROUP_SELECTOR: ToolGroupSelector = () => 'core';
84
-
85
55
  /**
86
56
  * Extended input interface with additional features:
87
57
  * - promptCache: Enable Bedrock prompt caching for tool definitions
88
58
  * - applicationInferenceProfile: Use an inference profile ARN instead of model ID
89
59
  * - serviceTier: Specify service tier (Priority, Standard, Flex, Reserved)
90
- * - toolCacheStrategy: How to allocate cachePoints across tools array
91
- * - toolGroupSelector: Group key resolver for the 'split' strategy
92
60
  */
93
61
  export interface IllumaBedrockConverseInput extends ChatBedrockConverseInput {
94
62
  /**
95
63
  * Enable Bedrock prompt caching for tool definitions.
96
- * When true, adds cachePoint marker(s) to tools array per
97
- * `toolCacheStrategy`. Defaults to 'single'.
64
+ * When true, adds cachePoint markers to tools array.
98
65
  */
99
66
  promptCache?: boolean;
100
67
 
101
- /**
102
- * Tool cachePoint allocation. Defaults to 'single' — one cachePoint at
103
- * the end of the tools array. Set to 'split' (with `toolGroupSelector`)
104
- * when different tool groups have different volatility.
105
- */
106
- toolCacheStrategy?: ToolCacheStrategy;
107
-
108
- /**
109
- * Group selector for 'split' strategy. Receives a tool name, returns
110
- * a stable group key. Defaults to a one-group selector (equivalent
111
- * to 'single').
112
- */
113
- toolGroupSelector?: ToolGroupSelector;
114
-
115
- /**
116
- * Additional model ID patterns to consider Bedrock-cache-supported.
117
- * Defaults are in `src/llm/bedrock/cacheSupport.ts`. Use this when
118
- * AWS adds a new model family before the next library release.
119
- */
120
- bedrockCacheModelPatterns?: readonly RegExp[];
121
-
122
68
  /**
123
69
  * Application Inference Profile ARN to use for the model.
124
70
  * For example, "arn:aws:bedrock:eu-west-1:123456789102:application-inference-profile/fm16bt65tzgx"
@@ -162,24 +108,11 @@ export class IllumaBedrockConverse extends ChatBedrockConverse {
162
108
  /** Service tier for model invocation */
163
109
  serviceTier?: ServiceTierType;
164
110
 
165
- /** Tool cachePoint allocation strategy. */
166
- toolCacheStrategy: ToolCacheStrategy;
167
-
168
- /** Group selector for 'split' strategy. */
169
- toolGroupSelector: ToolGroupSelector;
170
-
171
- /** Optional consumer extensions to the cache-supported model allowlist. */
172
- bedrockCacheModelPatterns?: readonly RegExp[];
173
-
174
111
  constructor(fields?: IllumaBedrockConverseInput) {
175
112
  super(fields);
176
113
  this.promptCache = fields?.promptCache ?? false;
177
114
  this.applicationInferenceProfile = fields?.applicationInferenceProfile;
178
115
  this.serviceTier = fields?.serviceTier;
179
- this.toolCacheStrategy = fields?.toolCacheStrategy ?? 'single';
180
- this.toolGroupSelector =
181
- fields?.toolGroupSelector ?? DEFAULT_TOOL_GROUP_SELECTOR;
182
- this.bedrockCacheModelPatterns = fields?.bedrockCacheModelPatterns;
183
116
 
184
117
  // Fix: Force supportsToolChoiceValues for Claude models
185
118
  // The parent constructor checks `model.includes('claude-3')` but this fails when:
@@ -250,64 +183,56 @@ export class IllumaBedrockConverse extends ChatBedrockConverse {
250
183
  }
251
184
  }
252
185
 
253
- /* Allowlist-based gate (see cacheSupport.ts). Replaces the old
254
- * substring heuristic — same default behavior for Claude/Anthropic/
255
- * Nova models, plus extension via `bedrockCacheModelPatterns`. */
256
- const cacheSupported = isBedrockCacheSupported(
257
- this.model,
258
- this.bedrockCacheModelPatterns,
259
- );
186
+ // Only Claude models support cachePoint - check model name
187
+ const modelId = this.model.toLowerCase();
188
+ const isClaudeModel =
189
+ modelId.includes('claude') || modelId.includes('anthropic');
260
190
 
261
191
  if (
262
192
  this.promptCache &&
263
- cacheSupported &&
264
- this.toolCacheStrategy !== 'none' &&
193
+ isClaudeModel &&
265
194
  params.toolConfig?.tools &&
266
195
  Array.isArray(params.toolConfig.tools) &&
267
196
  params.toolConfig.tools.length > 0
268
197
  ) {
269
- const tools = params.toolConfig.tools;
270
-
271
- if (this.toolCacheStrategy === 'single') {
272
- /* SINGLE: one cachePoint at the end of the tools array. Lightest
273
- * budget use; appropriate when the entire tools array is treated
274
- * as one unit and changes together. */
275
- const toolsWithCache = [
276
- ...tools,
277
- { cachePoint: { type: 'default' } } as (typeof tools)[number],
278
- ];
279
- params.toolConfig.tools = toolsWithCache;
280
- } else if (this.toolCacheStrategy === 'split') {
281
- /* SPLIT: group tools by `toolGroupSelector` and emit a cachePoint
282
- * after each non-empty group. Group order follows first-encounter
283
- * order in the input. Use when groups have different volatility
284
- * (e.g. stable core tools + volatile MCP tools). */
285
- const groupOrder: string[] = [];
286
- const groupMap = new Map<string, typeof tools>();
287
- for (const tool of tools) {
288
- const toolName =
289
- (tool as { toolSpec?: { name?: string } }).toolSpec?.name ?? '';
290
- const groupKey = this.toolGroupSelector(toolName);
291
- let group = groupMap.get(groupKey);
292
- if (!group) {
293
- group = [];
294
- groupMap.set(groupKey, group);
295
- groupOrder.push(groupKey);
296
- }
297
- group.push(tool);
198
+ // Separate core tools from MCP tools
199
+ // MCP tools have '_mcp_' in their name (e.g., 'search_emails_mcp_Google-Workspace')
200
+ const coreTools: typeof params.toolConfig.tools = [];
201
+ const mcpTools: typeof params.toolConfig.tools = [];
202
+
203
+ for (const tool of params.toolConfig.tools) {
204
+ // Check if tool has a name property with '_mcp_' pattern
205
+ const toolName =
206
+ (tool as { toolSpec?: { name?: string } }).toolSpec?.name ?? '';
207
+ if (toolName.includes('_mcp_')) {
208
+ mcpTools.push(tool);
209
+ } else {
210
+ coreTools.push(tool);
298
211
  }
212
+ }
299
213
 
300
- const toolsWithCache: typeof tools = [];
301
- for (const groupKey of groupOrder) {
302
- const group = groupMap.get(groupKey);
303
- if (!group || group.length === 0) continue;
304
- toolsWithCache.push(...group);
305
- toolsWithCache.push(
306
- { cachePoint: { type: 'default' } } as (typeof tools)[number],
307
- );
308
- }
309
- params.toolConfig.tools = toolsWithCache;
214
+ // Build tools array with strategic cachePoints:
215
+ // [CoreTool1, CoreTool2, cachePoint] + [MCPTool1, MCPTool2, cachePoint]
216
+ const toolsWithCache: typeof params.toolConfig.tools = [];
217
+
218
+ // Add core tools with cachePoint (if any)
219
+ if (coreTools.length > 0) {
220
+ toolsWithCache.push(...coreTools);
221
+ toolsWithCache.push({ cachePoint: { type: 'default' } });
222
+ }
223
+
224
+ // Add MCP tools with their own cachePoint (if any)
225
+ if (mcpTools.length > 0) {
226
+ toolsWithCache.push(...mcpTools);
227
+ toolsWithCache.push({ cachePoint: { type: 'default' } });
228
+ }
229
+
230
+ // If no tools at all (shouldn't happen but safety check)
231
+ if (toolsWithCache.length === 0) {
232
+ toolsWithCache.push({ cachePoint: { type: 'default' } });
310
233
  }
234
+
235
+ params.toolConfig.tools = toolsWithCache;
311
236
  }
312
237
 
313
238
  // Add serviceTier support
@@ -302,10 +302,6 @@ export function _convertMessagesToOpenAIParams(
302
302
  model?: string,
303
303
  options?: ConvertMessagesOptions
304
304
  ): OpenAICompletionParam[] {
305
- /* DeepSeek reasoning roundtrip (upstream PR #136): reasoning_content on
306
- * an AI message must be re-sent only when the message participates in a
307
- * tool-call exchange. Track context across the message flat-map. */
308
- let hasReasoningToolCallContext = false;
309
305
  // TODO: Function messages do not support array content, fix cast
310
306
  return messages.flatMap((message) => {
311
307
  let role = messageToOpenAIRole(message);
@@ -336,8 +332,6 @@ export function _convertMessagesToOpenAIParams(
336
332
  role,
337
333
  content,
338
334
  };
339
- let messageHasToolCalls = false;
340
- let messageIsToolResult = false;
341
335
  if (message.name != null) {
342
336
  completionParam.name = message.name;
343
337
  }
@@ -346,11 +340,17 @@ export function _convertMessagesToOpenAIParams(
346
340
  completionParam.content = '';
347
341
  }
348
342
  if (isAIMessage(message) && !!message.tool_calls?.length) {
349
- messageHasToolCalls = true;
350
343
  completionParam.tool_calls = message.tool_calls.map(
351
344
  convertLangChainToolCallToOpenAI
352
345
  );
353
346
  completionParam.content = hasAnthropicThinkingBlock ? content : '';
347
+ if (
348
+ options?.includeReasoningContent === true &&
349
+ message.additional_kwargs.reasoning_content != null
350
+ ) {
351
+ completionParam.reasoning_content =
352
+ message.additional_kwargs.reasoning_content;
353
+ }
354
354
  if (
355
355
  options?.includeReasoningDetails === true &&
356
356
  message.additional_kwargs.reasoning_details != null
@@ -398,10 +398,14 @@ export function _convertMessagesToOpenAIParams(
398
398
  }
399
399
  } else {
400
400
  if (message.additional_kwargs.tool_calls != null) {
401
- messageHasToolCalls =
402
- !Array.isArray(message.additional_kwargs.tool_calls) ||
403
- message.additional_kwargs.tool_calls.length > 0;
404
401
  completionParam.tool_calls = message.additional_kwargs.tool_calls;
402
+ if (
403
+ options?.includeReasoningContent === true &&
404
+ message.additional_kwargs.reasoning_content != null
405
+ ) {
406
+ completionParam.reasoning_content =
407
+ message.additional_kwargs.reasoning_content;
408
+ }
405
409
  if (
406
410
  options?.includeReasoningDetails === true &&
407
411
  message.additional_kwargs.reasoning_details != null
@@ -449,31 +453,10 @@ export function _convertMessagesToOpenAIParams(
449
453
  }
450
454
  }
451
455
  if ((message as ToolMessage).tool_call_id != null) {
452
- messageIsToolResult = true;
453
456
  completionParam.tool_call_id = (message as ToolMessage).tool_call_id;
454
457
  }
455
458
  }
456
459
 
457
- /* DeepSeek reasoning roundtrip (upstream PR #136): emit
458
- * reasoning_content only when the message is part of a tool-call
459
- * exchange — either the message itself has tool_calls, or a previous
460
- * AI/tool message established the context. Skipping the gate causes
461
- * DeepSeek to drop reasoning content during multi-turn replays. */
462
- if (
463
- options?.includeReasoningContent === true &&
464
- isAIMessage(message) &&
465
- (hasReasoningToolCallContext || messageHasToolCalls) &&
466
- typeof message.additional_kwargs.reasoning_content === 'string' &&
467
- message.additional_kwargs.reasoning_content !== ''
468
- ) {
469
- completionParam.reasoning_content =
470
- message.additional_kwargs.reasoning_content;
471
- }
472
-
473
- if (messageHasToolCalls || messageIsToolResult) {
474
- hasReasoningToolCallContext = true;
475
- }
476
-
477
460
  if (
478
461
  message.additional_kwargs.audio &&
479
462
  typeof message.additional_kwargs.audio === 'object' &&