@illuma-ai/agents 1.5.1 → 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 (319) hide show
  1. package/README.md +0 -62
  2. package/dist/cjs/agents/AgentContext.cjs +160 -259
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/enum.cjs +12 -12
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +30 -13
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
  11. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs +1 -1
  13. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  14. package/dist/cjs/hooks/matchers.cjs +2 -2
  15. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  16. package/dist/cjs/hooks/types.cjs +1 -1
  17. package/dist/cjs/hooks/types.cjs.map +1 -1
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -5
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/bedrock/index.cjs +33 -61
  21. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  22. package/dist/cjs/llm/openai/index.cjs +1 -1
  23. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  24. package/dist/cjs/llm/openai/utils/index.cjs +10 -27
  25. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  26. package/dist/cjs/main.cjs +3 -84
  27. package/dist/cjs/main.cjs.map +1 -1
  28. package/dist/cjs/memory/citations.cjs +4 -4
  29. package/dist/cjs/memory/citations.cjs.map +1 -1
  30. package/dist/cjs/memory/constants.cjs +17 -17
  31. package/dist/cjs/memory/constants.cjs.map +1 -1
  32. package/dist/cjs/memory/mmr.cjs +1 -1
  33. package/dist/cjs/memory/mmr.cjs.map +1 -1
  34. package/dist/cjs/memory/paths.cjs +1 -1
  35. package/dist/cjs/memory/paths.cjs.map +1 -1
  36. package/dist/cjs/memory/recallTracking.cjs +3 -3
  37. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  38. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  39. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  40. package/dist/cjs/messages/cache.cjs +0 -89
  41. package/dist/cjs/messages/cache.cjs.map +1 -1
  42. package/dist/cjs/messages/format.cjs +13 -71
  43. package/dist/cjs/messages/format.cjs.map +1 -1
  44. package/dist/cjs/tools/BashExecutor.cjs +11 -21
  45. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  46. package/dist/cjs/tools/CodeExecutor.cjs +13 -41
  47. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  48. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +11 -16
  49. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  50. package/dist/cjs/tools/ToolNode.cjs +78 -13
  51. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  52. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  53. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  54. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  55. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  56. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  57. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  58. package/dist/cjs/tools/memory/shared.cjs +1 -1
  59. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  60. package/dist/cjs/tools/search/search.cjs +3 -11
  61. package/dist/cjs/tools/search/search.cjs.map +1 -1
  62. package/dist/cjs/tools/search/tool.cjs +4 -28
  63. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  64. package/dist/cjs/tools/search/utils.cjs +3 -10
  65. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  66. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +48 -0
  67. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  68. package/dist/cjs/types/graph.cjs.map +1 -1
  69. package/dist/esm/agents/AgentContext.mjs +160 -259
  70. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  71. package/dist/esm/common/enum.mjs +12 -12
  72. package/dist/esm/common/enum.mjs.map +1 -1
  73. package/dist/esm/graphs/Graph.mjs +30 -13
  74. package/dist/esm/graphs/Graph.mjs.map +1 -1
  75. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
  76. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  77. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  78. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  79. package/dist/esm/hooks/HookRegistry.mjs +1 -1
  80. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  81. package/dist/esm/hooks/matchers.mjs +2 -2
  82. package/dist/esm/hooks/matchers.mjs.map +1 -1
  83. package/dist/esm/hooks/types.mjs +1 -1
  84. package/dist/esm/hooks/types.mjs.map +1 -1
  85. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -5
  86. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  87. package/dist/esm/llm/bedrock/index.mjs +34 -61
  88. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  89. package/dist/esm/llm/openai/index.mjs +1 -1
  90. package/dist/esm/llm/openai/index.mjs.map +1 -1
  91. package/dist/esm/llm/openai/utils/index.mjs +10 -27
  92. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  93. package/dist/esm/main.mjs +1 -5
  94. package/dist/esm/main.mjs.map +1 -1
  95. package/dist/esm/memory/citations.mjs +4 -4
  96. package/dist/esm/memory/citations.mjs.map +1 -1
  97. package/dist/esm/memory/constants.mjs +17 -17
  98. package/dist/esm/memory/constants.mjs.map +1 -1
  99. package/dist/esm/memory/mmr.mjs +1 -1
  100. package/dist/esm/memory/mmr.mjs.map +1 -1
  101. package/dist/esm/memory/paths.mjs +1 -1
  102. package/dist/esm/memory/paths.mjs.map +1 -1
  103. package/dist/esm/memory/recallTracking.mjs +3 -3
  104. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  105. package/dist/esm/memory/temporalDecay.mjs +2 -2
  106. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  107. package/dist/esm/messages/cache.mjs +0 -89
  108. package/dist/esm/messages/cache.mjs.map +1 -1
  109. package/dist/esm/messages/format.mjs +13 -71
  110. package/dist/esm/messages/format.mjs.map +1 -1
  111. package/dist/esm/tools/BashExecutor.mjs +12 -22
  112. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  113. package/dist/esm/tools/CodeExecutor.mjs +14 -41
  114. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  115. package/dist/esm/tools/ProgrammaticToolCalling.mjs +12 -17
  116. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  117. package/dist/esm/tools/ToolNode.mjs +78 -13
  118. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  119. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  120. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  121. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  122. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  123. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  124. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  125. package/dist/esm/tools/memory/shared.mjs +1 -1
  126. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  127. package/dist/esm/tools/search/search.mjs +3 -11
  128. package/dist/esm/tools/search/search.mjs.map +1 -1
  129. package/dist/esm/tools/search/tool.mjs +4 -28
  130. package/dist/esm/tools/search/tool.mjs.map +1 -1
  131. package/dist/esm/tools/search/utils.mjs +3 -10
  132. package/dist/esm/tools/search/utils.mjs.map +1 -1
  133. package/dist/esm/tools/subagent/SubagentExecutor.mjs +48 -0
  134. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  135. package/dist/esm/types/graph.mjs.map +1 -1
  136. package/dist/types/agents/AgentContext.d.ts +25 -95
  137. package/dist/types/common/enum.d.ts +12 -12
  138. package/dist/types/graphs/Graph.d.ts +2 -2
  139. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  140. package/dist/types/hooks/HookRegistry.d.ts +1 -1
  141. package/dist/types/hooks/matchers.d.ts +2 -2
  142. package/dist/types/hooks/types.d.ts +1 -1
  143. package/dist/types/index.d.ts +0 -1
  144. package/dist/types/llm/bedrock/index.d.ts +1 -54
  145. package/dist/types/llm/openai/index.d.ts +1 -1
  146. package/dist/types/memory/citations.d.ts +4 -4
  147. package/dist/types/memory/constants.d.ts +17 -17
  148. package/dist/types/memory/mmr.d.ts +3 -3
  149. package/dist/types/memory/paths.d.ts +1 -1
  150. package/dist/types/memory/temporalDecay.d.ts +2 -2
  151. package/dist/types/memory/types.d.ts +3 -3
  152. package/dist/types/messages/format.d.ts +2 -5
  153. package/dist/types/tools/CodeExecutor.d.ts +0 -6
  154. package/dist/types/tools/ToolNode.d.ts +3 -3
  155. package/dist/types/tools/memory/shared.d.ts +1 -1
  156. package/dist/types/tools/search/test.d.ts +1 -0
  157. package/dist/types/tools/search/types.d.ts +5 -99
  158. package/dist/types/tools/search/utils.d.ts +2 -2
  159. package/dist/types/tools/subagent/SubagentExecutor.d.ts +29 -0
  160. package/dist/types/types/graph.d.ts +30 -34
  161. package/dist/types/types/index.d.ts +0 -1
  162. package/dist/types/types/messages.d.ts +1 -1
  163. package/dist/types/types/run.d.ts +1 -3
  164. package/dist/types/types/tools.d.ts +5 -14
  165. package/package.json +1 -61
  166. package/src/agents/AgentContext.test.ts +176 -0
  167. package/src/agents/AgentContext.ts +179 -305
  168. package/src/agents/__tests__/AgentContext.test.ts +0 -632
  169. package/src/common/__tests__/enum.test.ts +1 -1
  170. package/src/common/enum.ts +12 -12
  171. package/src/graphs/Graph.ts +32 -13
  172. package/src/graphs/MultiAgentGraph.ts +1 -1
  173. package/src/graphs/gapFeatures.test.ts +1 -1
  174. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  175. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  176. package/src/hooks/HookRegistry.ts +1 -1
  177. package/src/hooks/index.ts +1 -1
  178. package/src/hooks/matchers.ts +2 -2
  179. package/src/hooks/types.ts +1 -1
  180. package/src/index.ts +0 -6
  181. package/src/llm/anthropic/utils/message_inputs.ts +1 -10
  182. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +18 -166
  183. package/src/llm/bedrock/index.ts +41 -116
  184. package/src/llm/openai/index.ts +2 -2
  185. package/src/llm/openai/utils/index.ts +14 -31
  186. package/src/memory/citations.ts +4 -4
  187. package/src/memory/constants.ts +17 -17
  188. package/src/memory/mmr.ts +3 -3
  189. package/src/memory/paths.ts +1 -1
  190. package/src/memory/recallTracking.ts +3 -3
  191. package/src/memory/temporalDecay.ts +2 -2
  192. package/src/memory/types.ts +3 -3
  193. package/src/messages/cache.test.ts +24 -62
  194. package/src/messages/cache.ts +0 -112
  195. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  196. package/src/messages/format.ts +13 -92
  197. package/src/messages/formatAgentMessages.test.ts +1 -1
  198. package/src/scripts/subagent-configurable-inheritance.ts +263 -0
  199. package/src/scripts/subagent-event-driven-debug.ts +2 -2
  200. package/src/specs/anthropic.simple.test.ts +0 -61
  201. package/src/specs/prune.orphans.test.ts +1 -1
  202. package/src/tools/BashExecutor.ts +13 -37
  203. package/src/tools/CodeExecutor.ts +14 -59
  204. package/src/tools/ProgrammaticToolCalling.ts +14 -29
  205. package/src/tools/ToolNode.ts +75 -14
  206. package/src/tools/__tests__/CodeExecutor.test.ts +3 -3
  207. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -60
  208. package/src/tools/__tests__/SubagentExecutor.test.ts +157 -0
  209. package/src/tools/memory/memoryAppendTool.ts +1 -1
  210. package/src/tools/memory/memoryGetTool.ts +2 -2
  211. package/src/tools/memory/memorySearchTool.ts +3 -3
  212. package/src/tools/memory/shared.ts +1 -1
  213. package/src/tools/search/output.md +2775 -0
  214. package/src/tools/search/search.ts +2 -12
  215. package/src/tools/search/test.html +884 -0
  216. package/src/tools/search/test.md +643 -0
  217. package/src/tools/search/test.ts +159 -0
  218. package/src/tools/search/tool.ts +2 -36
  219. package/src/tools/search/types.ts +8 -133
  220. package/src/tools/search/utils.ts +5 -13
  221. package/src/tools/subagent/SubagentExecutor.ts +78 -0
  222. package/src/types/graph.ts +27 -34
  223. package/src/types/index.ts +0 -1
  224. package/src/types/messages.ts +1 -1
  225. package/src/types/run.ts +1 -3
  226. package/src/types/tools.ts +5 -14
  227. package/dist/cjs/langchain/google-common.cjs +0 -3
  228. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  229. package/dist/cjs/langchain/index.cjs +0 -86
  230. package/dist/cjs/langchain/index.cjs.map +0 -1
  231. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  232. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  233. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  234. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  235. package/dist/cjs/langchain/messages.cjs +0 -51
  236. package/dist/cjs/langchain/messages.cjs.map +0 -1
  237. package/dist/cjs/langchain/openai.cjs +0 -3
  238. package/dist/cjs/langchain/openai.cjs.map +0 -1
  239. package/dist/cjs/langchain/prompts.cjs +0 -11
  240. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  241. package/dist/cjs/langchain/runnables.cjs +0 -19
  242. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  243. package/dist/cjs/langchain/tools.cjs +0 -23
  244. package/dist/cjs/langchain/tools.cjs.map +0 -1
  245. package/dist/cjs/langchain/utils/env.cjs +0 -11
  246. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  247. package/dist/cjs/llm/bedrock/cacheSupport.cjs +0 -55
  248. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +0 -1
  249. package/dist/cjs/tools/search/tavily-scraper.cjs +0 -189
  250. package/dist/cjs/tools/search/tavily-scraper.cjs.map +0 -1
  251. package/dist/cjs/tools/search/tavily-search.cjs +0 -372
  252. package/dist/cjs/tools/search/tavily-search.cjs.map +0 -1
  253. package/dist/cjs/types/agent-cache.cjs +0 -54
  254. package/dist/cjs/types/agent-cache.cjs.map +0 -1
  255. package/dist/esm/langchain/google-common.mjs +0 -2
  256. package/dist/esm/langchain/google-common.mjs.map +0 -1
  257. package/dist/esm/langchain/index.mjs +0 -5
  258. package/dist/esm/langchain/index.mjs.map +0 -1
  259. package/dist/esm/langchain/language_models/chat_models.mjs +0 -2
  260. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  261. package/dist/esm/langchain/messages/tool.mjs +0 -2
  262. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  263. package/dist/esm/langchain/messages.mjs +0 -2
  264. package/dist/esm/langchain/messages.mjs.map +0 -1
  265. package/dist/esm/langchain/openai.mjs +0 -2
  266. package/dist/esm/langchain/openai.mjs.map +0 -1
  267. package/dist/esm/langchain/prompts.mjs +0 -2
  268. package/dist/esm/langchain/prompts.mjs.map +0 -1
  269. package/dist/esm/langchain/runnables.mjs +0 -2
  270. package/dist/esm/langchain/runnables.mjs.map +0 -1
  271. package/dist/esm/langchain/tools.mjs +0 -2
  272. package/dist/esm/langchain/tools.mjs.map +0 -1
  273. package/dist/esm/langchain/utils/env.mjs +0 -2
  274. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  275. package/dist/esm/llm/bedrock/cacheSupport.mjs +0 -52
  276. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +0 -1
  277. package/dist/esm/tools/search/tavily-scraper.mjs +0 -186
  278. package/dist/esm/tools/search/tavily-scraper.mjs.map +0 -1
  279. package/dist/esm/tools/search/tavily-search.mjs +0 -370
  280. package/dist/esm/tools/search/tavily-search.mjs.map +0 -1
  281. package/dist/esm/types/agent-cache.mjs +0 -52
  282. package/dist/esm/types/agent-cache.mjs.map +0 -1
  283. package/dist/types/langchain/google-common.d.ts +0 -1
  284. package/dist/types/langchain/index.d.ts +0 -8
  285. package/dist/types/langchain/language_models/chat_models.d.ts +0 -1
  286. package/dist/types/langchain/messages/tool.d.ts +0 -1
  287. package/dist/types/langchain/messages.d.ts +0 -2
  288. package/dist/types/langchain/openai.d.ts +0 -1
  289. package/dist/types/langchain/prompts.d.ts +0 -1
  290. package/dist/types/langchain/runnables.d.ts +0 -2
  291. package/dist/types/langchain/tools.d.ts +0 -2
  292. package/dist/types/langchain/utils/env.d.ts +0 -1
  293. package/dist/types/llm/bedrock/cacheSupport.d.ts +0 -35
  294. package/dist/types/tools/search/tavily-scraper.d.ts +0 -19
  295. package/dist/types/tools/search/tavily-search.d.ts +0 -4
  296. package/dist/types/tools/subagent/types.d.ts +0 -84
  297. package/dist/types/types/agent-cache.d.ts +0 -71
  298. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +0 -259
  299. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +0 -266
  300. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +0 -342
  301. package/src/langchain/google-common.ts +0 -1
  302. package/src/langchain/index.ts +0 -8
  303. package/src/langchain/language_models/chat_models.ts +0 -1
  304. package/src/langchain/messages/tool.ts +0 -5
  305. package/src/langchain/messages.ts +0 -21
  306. package/src/langchain/openai.ts +0 -1
  307. package/src/langchain/prompts.ts +0 -1
  308. package/src/langchain/runnables.ts +0 -7
  309. package/src/langchain/tools.ts +0 -8
  310. package/src/langchain/utils/env.ts +0 -1
  311. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -436
  312. package/src/llm/bedrock/cacheSupport.test.ts +0 -99
  313. package/src/llm/bedrock/cacheSupport.ts +0 -53
  314. package/src/tools/search/tavily-scraper.ts +0 -235
  315. package/src/tools/search/tavily-search.ts +0 -424
  316. package/src/tools/search/tavily.test.ts +0 -965
  317. package/src/tools/subagent/types.test.ts +0 -70
  318. package/src/tools/subagent/types.ts +0 -115
  319. package/src/types/agent-cache.ts +0 -74
@@ -1,342 +0,0 @@
1
- /* eslint-disable no-console */
2
- /**
3
- * LIVE Bedrock prompt-cache verification: cross-user, account-level.
4
- *
5
- * What this test proves:
6
- *
7
- * 1. The `cachePoint` block emitted inline by `buildSystemRunnable` for
8
- * Bedrock actually causes Bedrock to write a cache entry.
9
- * 2. The cache entry is keyed off the STABLE prefix only — two simulated
10
- * users (Alice, Bob) with the SAME `agent.instructions` but DIFFERENT
11
- * `additional_instructions` both hit the same cache entry.
12
- * 3. Bedrock's prompt cache is account-scoped: a second AgentContext (a
13
- * separate "user") in the SAME AWS account reads the cache that the
14
- * first user populated.
15
- *
16
- * What it does NOT prove (out of scope for a unit-runner):
17
- * - True concurrent multi-tenant load (this runs sequentially)
18
- * - Cache TTL / eviction behavior
19
- * - Behavior across AWS accounts (cache is account-scoped by design)
20
- *
21
- * Run with:
22
- * BEDROCK_AWS_REGION=us-east-1 \
23
- * BEDROCK_AWS_ACCESS_KEY_ID=... \
24
- * BEDROCK_AWS_SECRET_ACCESS_KEY=... \
25
- * npx jest src/agents/__tests__/AgentContext.crossUserCache.live.test.ts
26
- *
27
- * Skipped automatically if Bedrock credentials are not present.
28
- */
29
-
30
- import { config } from 'dotenv';
31
- config();
32
-
33
- import { HumanMessage, SystemMessage } from '@langchain/core/messages';
34
- import type { BaseMessage, AIMessage } from '@langchain/core/messages';
35
- import { IllumaBedrockConverse } from '@/llm/bedrock';
36
- import { addBedrockCacheControl } from '@/messages/cache';
37
- import { AgentContext } from '../AgentContext';
38
- import { Providers } from '@/common';
39
- import type * as t from '@/types';
40
-
41
- const region =
42
- process.env.BEDROCK_AWS_REGION ??
43
- process.env.BEDROCK_AWS_DEFAULT_REGION ??
44
- process.env.AWS_REGION ??
45
- 'us-east-1';
46
- const accessKeyId =
47
- process.env.BEDROCK_AWS_ACCESS_KEY_ID ?? process.env.AWS_ACCESS_KEY_ID;
48
- const secretAccessKey =
49
- process.env.BEDROCK_AWS_SECRET_ACCESS_KEY ??
50
- process.env.AWS_SECRET_ACCESS_KEY;
51
-
52
- const haveBedrock =
53
- accessKeyId !== undefined &&
54
- accessKeyId !== '' &&
55
- secretAccessKey !== undefined &&
56
- secretAccessKey !== '';
57
-
58
- /**
59
- * Build a stable system prompt LARGER than the Bedrock cache write minimum.
60
- * Anthropic Claude on Bedrock generally needs ≥ 1024 tokens before cache
61
- * writes are honoured; we pad to ~2k tokens of stable text to be safe.
62
- */
63
- const buildLargeStableInstructions = (): string => {
64
- const header =
65
- 'You are a helpful assistant working as part of a multi-user platform.';
66
- const padding = Array.from({ length: 80 }, (_, i) =>
67
- `Rule ${i + 1}: When responding, prefer concise and accurate answers. Cite assumptions explicitly. Treat all users with respect. Do not hallucinate facts. If unsure, say so.`
68
- ).join('\n');
69
- return `${header}\n\n${padding}`;
70
- };
71
-
72
- const STABLE_INSTRUCTIONS = buildLargeStableInstructions();
73
-
74
- const describeFn = haveBedrock ? describe : describe.skip;
75
-
76
- /**
77
- * Run one Bedrock call through the real AgentContext + IllumaBedrockConverse
78
- * pipeline and return the raw usage_metadata so we can read
79
- * `input_token_details.cache_read` / `cache_creation`.
80
- */
81
- async function runOneTurn({
82
- agentInstructions,
83
- additionalInstructions,
84
- userQuery,
85
- agentId,
86
- }: {
87
- agentInstructions: string;
88
- additionalInstructions: string;
89
- userQuery: string;
90
- agentId: string;
91
- }): Promise<{
92
- context: AgentContext;
93
- usage: {
94
- input_tokens?: number;
95
- output_tokens?: number;
96
- cache_read_input_tokens?: number;
97
- cache_creation_input_tokens?: number;
98
- };
99
- systemPrefixSnapshot: string;
100
- }> {
101
- const ctx = AgentContext.fromConfig({
102
- agentId,
103
- provider: Providers.BEDROCK,
104
- instructions: agentInstructions,
105
- additional_instructions: additionalInstructions,
106
- clientOptions: {
107
- promptCache: true,
108
- model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
109
- } as t.BedrockAnthropicClientOptions,
110
- });
111
-
112
- const runnable = ctx.systemRunnable;
113
- expect(runnable).toBeDefined();
114
-
115
- /* Capture the cacheable prefix as a deterministic string snapshot so we
116
- * can compare two contexts for byte-equality (cache stability rule). */
117
- const systemArr = (await runnable!.invoke([])) as BaseMessage[];
118
- const sysContent = systemArr[0].content as Array<Record<string, unknown>>;
119
- /* Anything up to and including the cachePoint block forms the cache
120
- * prefix — we serialize that slice for comparison. */
121
- const cpIdx = sysContent.findIndex((b) => 'cachePoint' in b);
122
- const prefixForCacheKey = JSON.stringify(
123
- cpIdx >= 0 ? sysContent.slice(0, cpIdx + 1) : sysContent
124
- );
125
-
126
- const userMessages: BaseMessage[] = [new HumanMessage(userQuery)];
127
- const allMessages = [...systemArr, ...userMessages];
128
- const finalMessages = addBedrockCacheControl<BaseMessage>(allMessages);
129
-
130
- /* System message must come through with cachePoint intact. Verify
131
- * defensively before paying for the API call. */
132
- const sys = finalMessages[0];
133
- const sysOut = sys.content as Array<Record<string, unknown>>;
134
- expect(sysOut.some((b) => 'cachePoint' in b)).toBe(true);
135
-
136
- const llm = new IllumaBedrockConverse({
137
- model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
138
- region,
139
- credentials: {
140
- accessKeyId: accessKeyId as string,
141
- secretAccessKey: secretAccessKey as string,
142
- },
143
- promptCache: true,
144
- streaming: false,
145
- });
146
-
147
- /* Use the non-streaming path so we can read usage metadata directly. */
148
- const aiMessage = (await llm.invoke(finalMessages)) as AIMessage;
149
-
150
- type UsageMeta = {
151
- input_tokens?: number;
152
- output_tokens?: number;
153
- cache_read_input_tokens?: number;
154
- cache_creation_input_tokens?: number;
155
- input_token_details?: {
156
- cache_read?: number;
157
- cache_creation?: number;
158
- };
159
- };
160
- type RespMeta = {
161
- usage?: {
162
- inputTokens?: number;
163
- outputTokens?: number;
164
- cacheReadInputTokens?: number;
165
- cacheWriteInputTokens?: number;
166
- };
167
- };
168
- const u = (aiMessage.usage_metadata ?? {}) as UsageMeta;
169
- const rmUsage = ((aiMessage.response_metadata ?? {}) as RespMeta).usage ?? {};
170
-
171
- /* LangChain Bedrock currently only surfaces basic input/output tokens in
172
- * usage_metadata. Cache fields are in response_metadata.usage as
173
- * cacheReadInputTokens / cacheWriteInputTokens. Read from both. */
174
- const cache_read_input_tokens =
175
- u.cache_read_input_tokens ??
176
- u.input_token_details?.cache_read ??
177
- rmUsage.cacheReadInputTokens ??
178
- 0;
179
- const cache_creation_input_tokens =
180
- u.cache_creation_input_tokens ??
181
- u.input_token_details?.cache_creation ??
182
- rmUsage.cacheWriteInputTokens ??
183
- 0;
184
-
185
- return {
186
- context: ctx,
187
- usage: {
188
- input_tokens: u.input_tokens,
189
- output_tokens: u.output_tokens,
190
- cache_read_input_tokens,
191
- cache_creation_input_tokens,
192
- },
193
- systemPrefixSnapshot: prefixForCacheKey,
194
- };
195
- }
196
-
197
- describeFn('LIVE: Bedrock cross-user prompt cache (account-scoped)', () => {
198
- jest.setTimeout(120000);
199
-
200
- test('two distinct users with same agent + different memory hit the SAME cache entry', async () => {
201
- /* Step 1 — user "Alice" makes the first call. Cache is cold so this
202
- * call writes the cache entry and pays cache_creation_input_tokens. */
203
- const alice = await runOneTurn({
204
- agentId: 'shared-agent',
205
- agentInstructions: STABLE_INSTRUCTIONS,
206
- additionalInstructions: 'User: Alice. Memories: meetings on Mondays.',
207
- userQuery: 'Say hi in five words.',
208
- });
209
-
210
- console.log('Alice usage:', alice.usage);
211
-
212
- /* Step 2 — user "Bob" makes the same agent's first call with DIFFERENT
213
- * dynamic context (different additional_instructions). Bob's stable
214
- * prefix is byte-identical to Alice's, so Bedrock should serve a cache
215
- * read for the system prefix even though Bob has never called before. */
216
- const bob = await runOneTurn({
217
- agentId: 'shared-agent',
218
- agentInstructions: STABLE_INSTRUCTIONS,
219
- additionalInstructions: 'User: Bob. Memories: lives in Berlin.',
220
- userQuery: 'Say hi in five words.',
221
- });
222
-
223
- console.log('Bob usage:', bob.usage);
224
-
225
- /* CONTRACT 1: stable prefix is byte-identical across the two users.
226
- * If this fails, the cross-user cache cannot work — the cache key
227
- * would differ. */
228
- expect(bob.systemPrefixSnapshot).toBe(alice.systemPrefixSnapshot);
229
-
230
- /* CONTRACT 2: Bob's stable prefix is served from cache. We accept
231
- * either cache_read > 0 (the strict assertion) OR a sane fallback if
232
- * Bedrock cache is in cooldown — in which case we at least require
233
- * Alice's call wrote one. */
234
- const aliceWroteCache =
235
- (alice.usage.cache_creation_input_tokens ?? 0) > 0 ||
236
- (alice.usage.cache_read_input_tokens ?? 0) > 0;
237
- const bobReadCache = (bob.usage.cache_read_input_tokens ?? 0) > 0;
238
-
239
- if (!bobReadCache) {
240
- console.warn(
241
- 'Bob did not see a cache_read. This usually means: ' +
242
- '(a) cache write was below Bedrock minimum (try larger STABLE_INSTRUCTIONS), or ' +
243
- '(b) the cachePoint reached Bedrock without an inference profile that supports caching. ' +
244
- 'Alice cache_creation_input_tokens=' +
245
- alice.usage.cache_creation_input_tokens
246
- );
247
- }
248
-
249
- expect(aliceWroteCache).toBe(true);
250
- expect(bobReadCache).toBe(true);
251
-
252
- /* CONTRACT 3: cost optimization is real. Bob's effective uncached
253
- * input should be much smaller than Alice's first uncached input,
254
- * because most of Bob's input was served from cache. */
255
- const aliceUncached = alice.usage.input_tokens ?? 0;
256
- const bobCacheRead = bob.usage.cache_read_input_tokens ?? 0;
257
- expect(bobCacheRead).toBeGreaterThan(aliceUncached / 2);
258
- });
259
-
260
- test('5 concurrent users hitting same agent → all read from shared cache entry', async () => {
261
- /* Simulates 5 concurrent users on the platform, each with their own
262
- * AgentContext (different agentId, different additional_instructions
263
- * a.k.a. memory) but identical agent.instructions. They fire requests
264
- * in parallel via Promise.all — every one of them must read the
265
- * shared system-prefix cache entry. */
266
- const distinctUsers = [
267
- { id: 'user-1', memory: 'Alice — likes morning meetings.' },
268
- { id: 'user-2', memory: 'Bob — based in Berlin.' },
269
- { id: 'user-3', memory: 'Carol — works in finance.' },
270
- { id: 'user-4', memory: 'Dave — prefers detailed responses.' },
271
- { id: 'user-5', memory: 'Eve — uses voice transcription.' },
272
- ];
273
-
274
- const results = await Promise.all(
275
- distinctUsers.map((u) =>
276
- runOneTurn({
277
- agentId: u.id,
278
- agentInstructions: STABLE_INSTRUCTIONS,
279
- additionalInstructions: u.memory,
280
- userQuery: 'reply with the word "ok"',
281
- })
282
- )
283
- );
284
-
285
- /* Each user got a usage breakdown — print so we have evidence. */
286
- results.forEach((r, i) => {
287
- console.log(
288
- `Concurrent user ${distinctUsers[i].id}: cache_read=${r.usage.cache_read_input_tokens}, ` +
289
- `cache_create=${r.usage.cache_creation_input_tokens}, input=${r.usage.input_tokens}`
290
- );
291
- });
292
-
293
- /* Stable prefix must be byte-identical across ALL users — same cache key. */
294
- const firstSnapshot = results[0].systemPrefixSnapshot;
295
- for (let i = 1; i < results.length; i++) {
296
- expect(results[i].systemPrefixSnapshot).toBe(firstSnapshot);
297
- }
298
-
299
- /* At least one user wrote cache OR all users read from a previously
300
- * populated cache. (Re-running the test rapidly may show all 5 reading
301
- * the cache from a prior run; first run will show one writing.) */
302
- const totalReads = results.reduce(
303
- (acc, r) => acc + (r.usage.cache_read_input_tokens ?? 0),
304
- 0
305
- );
306
- const totalWrites = results.reduce(
307
- (acc, r) => acc + (r.usage.cache_creation_input_tokens ?? 0),
308
- 0
309
- );
310
- expect(totalReads + totalWrites).toBeGreaterThan(0);
311
-
312
- /* Most users should read from cache. With 5 concurrent requests on a
313
- * cold cache, exactly 1 may write and 4 may read; on a warm cache, 5
314
- * read. Either way, at least 4 of 5 must show a cache_read. */
315
- const usersWithCacheRead = results.filter(
316
- (r) => (r.usage.cache_read_input_tokens ?? 0) > 0
317
- ).length;
318
- expect(usersWithCacheRead).toBeGreaterThanOrEqual(4);
319
- });
320
-
321
- test('byte-identical agent.instructions across runs → cross-run cache hit (single user, two requests)', async () => {
322
- /* Same user, two requests with same stable prefix and same dynamic
323
- * context. Second request must read from cache. */
324
- const r1 = await runOneTurn({
325
- agentId: 'sticky-agent',
326
- agentInstructions: STABLE_INSTRUCTIONS,
327
- additionalInstructions: 'Session 1',
328
- userQuery: 'one word: hi',
329
- });
330
- const r2 = await runOneTurn({
331
- agentId: 'sticky-agent',
332
- agentInstructions: STABLE_INSTRUCTIONS,
333
- additionalInstructions: 'Session 1',
334
- userQuery: 'one word: bye',
335
- });
336
-
337
- console.log('Run1 usage:', r1.usage);
338
- console.log('Run2 usage:', r2.usage);
339
-
340
- expect((r2.usage.cache_read_input_tokens ?? 0) > 0).toBe(true);
341
- });
342
- });
@@ -1 +0,0 @@
1
- export type { GoogleAIToolType } from '@langchain/google-common';
@@ -1,8 +0,0 @@
1
- export * from './messages';
2
- export * from './prompts';
3
- export * from './runnables';
4
- export * from './tools';
5
- export * from './google-common';
6
- export * from './language_models/chat_models';
7
- export * from './messages/tool';
8
- export * from './openai';
@@ -1 +0,0 @@
1
- export type { BindToolsInput } from '@langchain/core/language_models/chat_models';
@@ -1,5 +0,0 @@
1
- export type {
2
- InvalidToolCall,
3
- ToolCall,
4
- ToolCallChunk,
5
- } from '@langchain/core/messages/tool';
@@ -1,21 +0,0 @@
1
- export {
2
- AIMessage,
3
- AIMessageChunk,
4
- BaseMessage,
5
- BaseMessageChunk,
6
- HumanMessage,
7
- SystemMessage,
8
- ToolMessage,
9
- getBufferString,
10
- isAIMessage,
11
- isBaseMessage,
12
- isToolMessage,
13
- } from '@langchain/core/messages';
14
-
15
- export type {
16
- BaseMessageFields,
17
- MessageContent,
18
- MessageContentText,
19
- MessageContentImageUrl,
20
- UsageMetadata,
21
- } from '@langchain/core/messages';
@@ -1 +0,0 @@
1
- export type { AzureOpenAIInput } from '@langchain/openai';
@@ -1 +0,0 @@
1
- export { PromptTemplate } from '@langchain/core/prompts';
@@ -1,7 +0,0 @@
1
- export {
2
- Runnable,
3
- RunnableLambda,
4
- RunnableSequence,
5
- } from '@langchain/core/runnables';
6
-
7
- export type { RunnableConfig } from '@langchain/core/runnables';
@@ -1,8 +0,0 @@
1
- export {
2
- DynamicStructuredTool,
3
- StructuredTool,
4
- Tool,
5
- tool,
6
- } from '@langchain/core/tools';
7
-
8
- export type { StructuredToolInterface } from '@langchain/core/tools';
@@ -1 +0,0 @@
1
- export { getEnvironmentVariable } from '@langchain/core/utils/env';