langchain 1.0.0-alpha.4 → 1.0.0-alpha.6

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 (384) hide show
  1. package/dist/agents/ReactAgent.cjs +5 -5
  2. package/dist/agents/ReactAgent.cjs.map +1 -1
  3. package/dist/agents/ReactAgent.d.cts +1 -3
  4. package/dist/agents/ReactAgent.d.cts.map +1 -1
  5. package/dist/agents/ReactAgent.d.ts +1 -3
  6. package/dist/agents/ReactAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactAgent.js +6 -6
  8. package/dist/agents/ReactAgent.js.map +1 -1
  9. package/dist/agents/RunnableCallable.cjs +5 -0
  10. package/dist/agents/RunnableCallable.cjs.map +1 -1
  11. package/dist/agents/RunnableCallable.d.cts +2 -0
  12. package/dist/agents/RunnableCallable.d.cts.map +1 -1
  13. package/dist/agents/RunnableCallable.d.ts +2 -0
  14. package/dist/agents/RunnableCallable.d.ts.map +1 -1
  15. package/dist/agents/RunnableCallable.js +5 -0
  16. package/dist/agents/RunnableCallable.js.map +1 -1
  17. package/dist/agents/annotation.cjs.map +1 -1
  18. package/dist/agents/annotation.d.cts +5 -7
  19. package/dist/agents/annotation.d.cts.map +1 -1
  20. package/dist/agents/annotation.d.ts +4 -6
  21. package/dist/agents/annotation.d.ts.map +1 -1
  22. package/dist/agents/annotation.js.map +1 -1
  23. package/dist/agents/createAgent.cjs +10 -0
  24. package/dist/agents/createAgent.cjs.map +1 -0
  25. package/dist/agents/createAgent.js +10 -0
  26. package/dist/agents/createAgent.js.map +1 -0
  27. package/dist/agents/index.cjs +23 -4
  28. package/dist/agents/index.cjs.map +1 -1
  29. package/dist/agents/index.d.cts +84 -21
  30. package/dist/agents/index.d.cts.map +1 -1
  31. package/dist/agents/index.d.ts +84 -21
  32. package/dist/agents/index.d.ts.map +1 -1
  33. package/dist/agents/index.js +23 -4
  34. package/dist/agents/index.js.map +1 -1
  35. package/dist/agents/middlewareAgent/ReactAgent.cjs +255 -0
  36. package/dist/agents/middlewareAgent/ReactAgent.cjs.map +1 -0
  37. package/dist/agents/middlewareAgent/ReactAgent.d.cts +67 -0
  38. package/dist/agents/middlewareAgent/ReactAgent.d.cts.map +1 -0
  39. package/dist/agents/middlewareAgent/ReactAgent.d.ts +67 -0
  40. package/dist/agents/middlewareAgent/ReactAgent.d.ts.map +1 -0
  41. package/dist/agents/middlewareAgent/ReactAgent.js +254 -0
  42. package/dist/agents/middlewareAgent/ReactAgent.js.map +1 -0
  43. package/dist/agents/middlewareAgent/annotation.cjs +39 -0
  44. package/dist/agents/middlewareAgent/annotation.cjs.map +1 -0
  45. package/dist/agents/middlewareAgent/annotation.js +38 -0
  46. package/dist/agents/middlewareAgent/annotation.js.map +1 -0
  47. package/dist/agents/middlewareAgent/index.cjs +11 -0
  48. package/dist/agents/middlewareAgent/index.cjs.map +1 -0
  49. package/dist/agents/middlewareAgent/index.js +11 -0
  50. package/dist/agents/middlewareAgent/index.js.map +1 -0
  51. package/dist/agents/middlewareAgent/middleware/hitl.cjs +235 -0
  52. package/dist/agents/middlewareAgent/middleware/hitl.cjs.map +1 -0
  53. package/dist/agents/middlewareAgent/middleware/hitl.d.cts +199 -0
  54. package/dist/agents/middlewareAgent/middleware/hitl.d.cts.map +1 -0
  55. package/dist/agents/middlewareAgent/middleware/hitl.d.ts +199 -0
  56. package/dist/agents/middlewareAgent/middleware/hitl.d.ts.map +1 -0
  57. package/dist/agents/middlewareAgent/middleware/hitl.js +234 -0
  58. package/dist/agents/middlewareAgent/middleware/hitl.js.map +1 -0
  59. package/dist/agents/middlewareAgent/middleware/index.cjs +26 -0
  60. package/dist/agents/middlewareAgent/middleware/index.cjs.map +1 -0
  61. package/dist/agents/middlewareAgent/middleware/index.d.cts +4 -0
  62. package/dist/agents/middlewareAgent/middleware/index.d.ts +4 -0
  63. package/dist/agents/middlewareAgent/middleware/index.js +17 -0
  64. package/dist/agents/middlewareAgent/middleware/index.js.map +1 -0
  65. package/dist/agents/middlewareAgent/middleware/promptCaching.cjs +182 -0
  66. package/dist/agents/middlewareAgent/middleware/promptCaching.cjs.map +1 -0
  67. package/dist/agents/middlewareAgent/middleware/promptCaching.d.cts +152 -0
  68. package/dist/agents/middlewareAgent/middleware/promptCaching.d.cts.map +1 -0
  69. package/dist/agents/middlewareAgent/middleware/promptCaching.d.ts +152 -0
  70. package/dist/agents/middlewareAgent/middleware/promptCaching.d.ts.map +1 -0
  71. package/dist/agents/middlewareAgent/middleware/promptCaching.js +181 -0
  72. package/dist/agents/middlewareAgent/middleware/promptCaching.js.map +1 -0
  73. package/dist/agents/middlewareAgent/middleware/summarization.cjs +262 -0
  74. package/dist/agents/middlewareAgent/middleware/summarization.cjs.map +1 -0
  75. package/dist/agents/middlewareAgent/middleware/summarization.d.cts +89 -0
  76. package/dist/agents/middlewareAgent/middleware/summarization.d.cts.map +1 -0
  77. package/dist/agents/middlewareAgent/middleware/summarization.d.ts +89 -0
  78. package/dist/agents/middlewareAgent/middleware/summarization.d.ts.map +1 -0
  79. package/dist/agents/middlewareAgent/middleware/summarization.js +260 -0
  80. package/dist/agents/middlewareAgent/middleware/summarization.js.map +1 -0
  81. package/dist/agents/middlewareAgent/middleware.cjs +47 -0
  82. package/dist/agents/middlewareAgent/middleware.cjs.map +1 -0
  83. package/dist/agents/middlewareAgent/middleware.d.cts +46 -0
  84. package/dist/agents/middlewareAgent/middleware.d.cts.map +1 -0
  85. package/dist/agents/middlewareAgent/middleware.d.ts +46 -0
  86. package/dist/agents/middlewareAgent/middleware.d.ts.map +1 -0
  87. package/dist/agents/middlewareAgent/middleware.js +46 -0
  88. package/dist/agents/middlewareAgent/middleware.js.map +1 -0
  89. package/dist/agents/middlewareAgent/nodes/AfterModalNode.cjs +29 -0
  90. package/dist/agents/middlewareAgent/nodes/AfterModalNode.cjs.map +1 -0
  91. package/dist/agents/middlewareAgent/nodes/AfterModalNode.js +29 -0
  92. package/dist/agents/middlewareAgent/nodes/AfterModalNode.js.map +1 -0
  93. package/dist/agents/middlewareAgent/nodes/AgentNode.cjs +325 -0
  94. package/dist/agents/middlewareAgent/nodes/AgentNode.cjs.map +1 -0
  95. package/dist/agents/middlewareAgent/nodes/AgentNode.js +324 -0
  96. package/dist/agents/middlewareAgent/nodes/AgentNode.js.map +1 -0
  97. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.cjs +27 -0
  98. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.cjs.map +1 -0
  99. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.js +27 -0
  100. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.js.map +1 -0
  101. package/dist/agents/middlewareAgent/nodes/middleware.cjs +73 -0
  102. package/dist/agents/middlewareAgent/nodes/middleware.cjs.map +1 -0
  103. package/dist/agents/middlewareAgent/nodes/middleware.js +73 -0
  104. package/dist/agents/middlewareAgent/nodes/middleware.js.map +1 -0
  105. package/dist/agents/middlewareAgent/nodes/utils.cjs +74 -0
  106. package/dist/agents/middlewareAgent/nodes/utils.cjs.map +1 -0
  107. package/dist/agents/middlewareAgent/nodes/utils.js +70 -0
  108. package/dist/agents/middlewareAgent/nodes/utils.js.map +1 -0
  109. package/dist/agents/middlewareAgent/types.d.cts +380 -0
  110. package/dist/agents/middlewareAgent/types.d.cts.map +1 -0
  111. package/dist/agents/middlewareAgent/types.d.ts +380 -0
  112. package/dist/agents/middlewareAgent/types.d.ts.map +1 -0
  113. package/dist/agents/nodes/AgentNode.cjs +4 -4
  114. package/dist/agents/nodes/AgentNode.cjs.map +1 -1
  115. package/dist/agents/nodes/AgentNode.js +4 -4
  116. package/dist/agents/nodes/AgentNode.js.map +1 -1
  117. package/dist/agents/nodes/ToolNode.cjs +3 -3
  118. package/dist/agents/nodes/ToolNode.cjs.map +1 -1
  119. package/dist/agents/nodes/ToolNode.d.cts +4 -5
  120. package/dist/agents/nodes/ToolNode.d.cts.map +1 -1
  121. package/dist/agents/nodes/ToolNode.d.ts +1 -2
  122. package/dist/agents/nodes/ToolNode.d.ts.map +1 -1
  123. package/dist/agents/nodes/ToolNode.js +4 -4
  124. package/dist/agents/nodes/ToolNode.js.map +1 -1
  125. package/dist/agents/responses.cjs +1 -1
  126. package/dist/agents/responses.cjs.map +1 -1
  127. package/dist/agents/responses.d.cts.map +1 -1
  128. package/dist/agents/responses.d.ts.map +1 -1
  129. package/dist/agents/responses.js +1 -1
  130. package/dist/agents/responses.js.map +1 -1
  131. package/dist/agents/types.d.cts +5 -7
  132. package/dist/agents/types.d.cts.map +1 -1
  133. package/dist/agents/types.d.ts +1 -3
  134. package/dist/agents/types.d.ts.map +1 -1
  135. package/dist/agents/utils.cjs +6 -6
  136. package/dist/agents/utils.cjs.map +1 -1
  137. package/dist/agents/utils.js +7 -7
  138. package/dist/agents/utils.js.map +1 -1
  139. package/dist/agents/withAgentName.cjs.map +1 -1
  140. package/dist/agents/withAgentName.js.map +1 -1
  141. package/dist/chains/api/api_chain.d.cts +1 -1
  142. package/dist/chains/api/prompts.cjs.map +1 -1
  143. package/dist/chains/api/prompts.js.map +1 -1
  144. package/dist/chains/base.d.cts +1 -1
  145. package/dist/chains/combine_docs_chain.d.cts +1 -1
  146. package/dist/chains/combine_documents/stuff.d.cts +1 -1
  147. package/dist/chains/constitutional_ai/constitutional_chain.cjs.map +1 -1
  148. package/dist/chains/constitutional_ai/constitutional_chain.js.map +1 -1
  149. package/dist/chains/conversational_retrieval_chain.d.cts +1 -1
  150. package/dist/chains/graph_qa/cypher.d.cts +1 -1
  151. package/dist/chains/history_aware_retriever.d.cts +2 -2
  152. package/dist/chains/index.cjs +0 -3
  153. package/dist/chains/index.cjs.map +1 -1
  154. package/dist/chains/index.d.cts +1 -2
  155. package/dist/chains/index.d.ts +1 -2
  156. package/dist/chains/index.js +1 -3
  157. package/dist/chains/index.js.map +1 -1
  158. package/dist/chains/llm_chain.d.cts +3 -3
  159. package/dist/chains/openai_functions/base.d.cts +3 -3
  160. package/dist/chains/openai_functions/extraction.cjs.map +1 -1
  161. package/dist/chains/openai_functions/extraction.d.cts +1 -3
  162. package/dist/chains/openai_functions/extraction.d.cts.map +1 -1
  163. package/dist/chains/openai_functions/extraction.d.ts +1 -3
  164. package/dist/chains/openai_functions/extraction.d.ts.map +1 -1
  165. package/dist/chains/openai_functions/extraction.js.map +1 -1
  166. package/dist/chains/openai_functions/index.cjs +0 -5
  167. package/dist/chains/openai_functions/index.cjs.map +1 -1
  168. package/dist/chains/openai_functions/index.d.cts +1 -2
  169. package/dist/chains/openai_functions/index.d.ts +1 -2
  170. package/dist/chains/openai_functions/index.js +1 -4
  171. package/dist/chains/openai_functions/index.js.map +1 -1
  172. package/dist/chains/openai_functions/openapi.cjs +4 -4
  173. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  174. package/dist/chains/openai_functions/openapi.d.cts +2 -2
  175. package/dist/chains/openai_functions/openapi.js +4 -4
  176. package/dist/chains/openai_functions/openapi.js.map +1 -1
  177. package/dist/chains/openai_functions/tagging.cjs.map +1 -1
  178. package/dist/chains/openai_functions/tagging.d.cts +2 -4
  179. package/dist/chains/openai_functions/tagging.d.cts.map +1 -1
  180. package/dist/chains/openai_functions/tagging.d.ts +1 -3
  181. package/dist/chains/openai_functions/tagging.d.ts.map +1 -1
  182. package/dist/chains/openai_functions/tagging.js.map +1 -1
  183. package/dist/chains/query_constructor/index.cjs +4 -4
  184. package/dist/chains/query_constructor/index.cjs.map +1 -1
  185. package/dist/chains/query_constructor/index.d.cts +5 -3
  186. package/dist/chains/query_constructor/index.d.cts.map +1 -1
  187. package/dist/chains/query_constructor/index.d.ts +4 -2
  188. package/dist/chains/query_constructor/index.d.ts.map +1 -1
  189. package/dist/chains/query_constructor/index.js +1 -1
  190. package/dist/chains/query_constructor/index.js.map +1 -1
  191. package/dist/chains/question_answering/map_reduce_prompts.cjs.map +1 -1
  192. package/dist/chains/question_answering/map_reduce_prompts.js.map +1 -1
  193. package/dist/chains/question_answering/refine_prompts.cjs.map +1 -1
  194. package/dist/chains/question_answering/refine_prompts.js.map +1 -1
  195. package/dist/chains/question_answering/stuff_prompts.cjs.map +1 -1
  196. package/dist/chains/question_answering/stuff_prompts.js.map +1 -1
  197. package/dist/chains/retrieval.d.cts +1 -1
  198. package/dist/chains/router/llm_router.d.cts +1 -1
  199. package/dist/chains/router/multi_prompt.cjs +4 -4
  200. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  201. package/dist/chains/router/multi_prompt.js +1 -1
  202. package/dist/chains/router/multi_prompt.js.map +1 -1
  203. package/dist/chains/router/multi_retrieval_qa.cjs +4 -4
  204. package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
  205. package/dist/chains/router/multi_retrieval_qa.js +1 -1
  206. package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
  207. package/dist/chains/sql_db/sql_db_chain.d.cts +2 -2
  208. package/dist/chains/sql_db/sql_db_prompt.cjs.map +1 -1
  209. package/dist/chains/sql_db/sql_db_prompt.d.cts.map +1 -1
  210. package/dist/chains/sql_db/sql_db_prompt.d.ts.map +1 -1
  211. package/dist/chains/sql_db/sql_db_prompt.js.map +1 -1
  212. package/dist/chains/summarization/stuff_prompts.cjs.map +1 -1
  213. package/dist/chains/summarization/stuff_prompts.js.map +1 -1
  214. package/dist/chat_models/universal.cjs +8 -5
  215. package/dist/chat_models/universal.cjs.map +1 -1
  216. package/dist/chat_models/universal.d.cts +4 -4
  217. package/dist/chat_models/universal.d.cts.map +1 -1
  218. package/dist/chat_models/universal.d.ts +2 -2
  219. package/dist/chat_models/universal.d.ts.map +1 -1
  220. package/dist/chat_models/universal.js +8 -5
  221. package/dist/chat_models/universal.js.map +1 -1
  222. package/dist/document_loaders/fs/directory.cjs.map +1 -1
  223. package/dist/document_loaders/fs/directory.d.cts +0 -1
  224. package/dist/document_loaders/fs/directory.d.cts.map +1 -1
  225. package/dist/document_loaders/fs/directory.d.ts +0 -1
  226. package/dist/document_loaders/fs/directory.d.ts.map +1 -1
  227. package/dist/document_loaders/fs/directory.js.map +1 -1
  228. package/dist/document_loaders/fs/json.cjs +7 -1
  229. package/dist/document_loaders/fs/json.cjs.map +1 -1
  230. package/dist/document_loaders/fs/json.js +7 -1
  231. package/dist/document_loaders/fs/json.js.map +1 -1
  232. package/dist/embeddings/cache_backed.cjs +1 -1
  233. package/dist/embeddings/cache_backed.cjs.map +1 -1
  234. package/dist/embeddings/cache_backed.d.cts +1 -1
  235. package/dist/embeddings/cache_backed.d.ts +1 -1
  236. package/dist/embeddings/cache_backed.js +2 -2
  237. package/dist/embeddings/cache_backed.js.map +1 -1
  238. package/dist/evaluation/agents/trajectory.d.cts +3 -3
  239. package/dist/evaluation/agents/trajectory.d.cts.map +1 -1
  240. package/dist/evaluation/agents/trajectory.d.ts.map +1 -1
  241. package/dist/evaluation/comparison/pairwise.d.cts +1 -1
  242. package/dist/evaluation/comparison/pairwise.d.cts.map +1 -1
  243. package/dist/evaluation/criteria/criteria.d.cts +1 -1
  244. package/dist/evaluation/criteria/criteria.d.cts.map +1 -1
  245. package/dist/evaluation/criteria/criteria.d.ts.map +1 -1
  246. package/dist/evaluation/embedding_distance/base.cjs +2 -4
  247. package/dist/evaluation/embedding_distance/base.cjs.map +1 -1
  248. package/dist/evaluation/embedding_distance/base.js +2 -3
  249. package/dist/evaluation/embedding_distance/base.js.map +1 -1
  250. package/dist/evaluation/loader.cjs +7 -12
  251. package/dist/evaluation/loader.cjs.map +1 -1
  252. package/dist/evaluation/loader.d.cts +8 -2
  253. package/dist/evaluation/loader.d.cts.map +1 -1
  254. package/dist/evaluation/loader.d.ts +8 -2
  255. package/dist/evaluation/loader.d.ts.map +1 -1
  256. package/dist/evaluation/loader.js +7 -12
  257. package/dist/evaluation/loader.js.map +1 -1
  258. package/dist/evaluation/qa/eval_chain.d.cts +1 -1
  259. package/dist/hub/base.cjs.map +1 -1
  260. package/dist/hub/base.js.map +1 -1
  261. package/dist/index.cjs +3 -0
  262. package/dist/index.cjs.map +1 -1
  263. package/dist/index.d.cts +5 -4
  264. package/dist/index.d.ts +3 -2
  265. package/dist/index.js +3 -1
  266. package/dist/index.js.map +1 -1
  267. package/dist/langchain-core/dist/load/serializable.d.cts.map +1 -1
  268. package/dist/langchain-core/dist/messages/base.d.cts +24 -33
  269. package/dist/langchain-core/dist/messages/base.d.cts.map +1 -1
  270. package/dist/langchain-core/dist/messages/content/index.d.cts +1 -1
  271. package/dist/langchain-core/dist/messages/content/index.d.cts.map +1 -1
  272. package/dist/langchain-core/dist/messages/message.d.cts +598 -0
  273. package/dist/langchain-core/dist/messages/message.d.cts.map +1 -0
  274. package/dist/langchain-core/dist/messages/metadata.d.cts +97 -0
  275. package/dist/langchain-core/dist/messages/metadata.d.cts.map +1 -0
  276. package/dist/langchain-core/dist/messages/utils.d.cts +75 -0
  277. package/dist/langchain-core/dist/messages/utils.d.cts.map +1 -0
  278. package/dist/langchain-core/dist/prompt_values.d.cts.map +1 -1
  279. package/dist/libs/langchain-core/dist/load/serializable.d.ts.map +1 -1
  280. package/dist/libs/langchain-core/dist/messages/base.d.ts +24 -33
  281. package/dist/libs/langchain-core/dist/messages/base.d.ts.map +1 -1
  282. package/dist/libs/langchain-core/dist/messages/content/index.d.ts +1 -1
  283. package/dist/libs/langchain-core/dist/messages/content/index.d.ts.map +1 -1
  284. package/dist/libs/langchain-core/dist/messages/message.d.ts +598 -0
  285. package/dist/libs/langchain-core/dist/messages/message.d.ts.map +1 -0
  286. package/dist/libs/langchain-core/dist/messages/metadata.d.ts +97 -0
  287. package/dist/libs/langchain-core/dist/messages/metadata.d.ts.map +1 -0
  288. package/dist/libs/langchain-core/dist/messages/utils.d.ts +75 -0
  289. package/dist/libs/langchain-core/dist/messages/utils.d.ts.map +1 -0
  290. package/dist/libs/langchain-core/dist/prompt_values.d.ts.map +1 -1
  291. package/dist/libs/langchain-core/dist/utils/types/index.d.ts +2 -0
  292. package/dist/libs/langchain-core/dist/utils/types/index.d.ts.map +1 -1
  293. package/dist/libs/langchain-core/dist/utils/types/zod.d.ts +1 -0
  294. package/dist/load/import_map.cjs +2 -13
  295. package/dist/load/import_map.cjs.map +1 -1
  296. package/dist/load/import_map.js +2 -13
  297. package/dist/load/import_map.js.map +1 -1
  298. package/dist/memory/prompt.cjs.map +1 -1
  299. package/dist/memory/prompt.d.cts.map +1 -1
  300. package/dist/memory/prompt.d.ts.map +1 -1
  301. package/dist/memory/prompt.js.map +1 -1
  302. package/dist/memory/summary.d.cts +1 -1
  303. package/dist/output_parsers/combining.cjs +1 -1
  304. package/dist/output_parsers/combining.cjs.map +1 -1
  305. package/dist/output_parsers/combining.js +1 -1
  306. package/dist/output_parsers/combining.js.map +1 -1
  307. package/dist/output_parsers/expression_type_handlers/array_literal_expression_handler.cjs.map +1 -1
  308. package/dist/output_parsers/expression_type_handlers/array_literal_expression_handler.js.map +1 -1
  309. package/dist/output_parsers/expression_type_handlers/base.cjs +1 -1
  310. package/dist/output_parsers/expression_type_handlers/base.cjs.map +1 -1
  311. package/dist/output_parsers/expression_type_handlers/base.js +1 -1
  312. package/dist/output_parsers/expression_type_handlers/base.js.map +1 -1
  313. package/dist/output_parsers/fix.d.cts +1 -1
  314. package/dist/output_parsers/http_response.d.cts +1 -1
  315. package/dist/output_parsers/regex.cjs.map +1 -1
  316. package/dist/output_parsers/regex.js.map +1 -1
  317. package/dist/output_parsers/structured.cjs +4 -4
  318. package/dist/output_parsers/structured.cjs.map +1 -1
  319. package/dist/output_parsers/structured.d.cts +2 -2
  320. package/dist/output_parsers/structured.d.cts.map +1 -1
  321. package/dist/output_parsers/structured.d.ts +1 -1
  322. package/dist/output_parsers/structured.d.ts.map +1 -1
  323. package/dist/output_parsers/structured.js +2 -2
  324. package/dist/output_parsers/structured.js.map +1 -1
  325. package/dist/retrievers/ensemble.cjs.map +1 -1
  326. package/dist/retrievers/ensemble.js.map +1 -1
  327. package/dist/storage/file_system.cjs +1 -1
  328. package/dist/storage/file_system.cjs.map +1 -1
  329. package/dist/storage/file_system.js +1 -1
  330. package/dist/storage/file_system.js.map +1 -1
  331. package/dist/tools/fs.cjs +5 -5
  332. package/dist/tools/fs.cjs.map +1 -1
  333. package/dist/tools/fs.d.cts +1 -1
  334. package/dist/tools/fs.d.cts.map +1 -1
  335. package/dist/tools/fs.d.ts +1 -1
  336. package/dist/tools/fs.d.ts.map +1 -1
  337. package/dist/tools/fs.js +1 -1
  338. package/dist/tools/fs.js.map +1 -1
  339. package/dist/tools/json.d.cts +1 -1
  340. package/dist/tools/retriever.cjs +2 -2
  341. package/dist/tools/retriever.cjs.map +1 -1
  342. package/dist/tools/retriever.d.cts +2 -2
  343. package/dist/tools/retriever.d.cts.map +1 -1
  344. package/dist/tools/retriever.d.ts +1 -1
  345. package/dist/tools/retriever.d.ts.map +1 -1
  346. package/dist/tools/retriever.js +1 -1
  347. package/dist/tools/retriever.js.map +1 -1
  348. package/dist/tools/sql.cjs +1 -2
  349. package/dist/tools/sql.cjs.map +1 -1
  350. package/dist/tools/sql.d.cts +1 -1
  351. package/dist/tools/sql.d.cts.map +1 -1
  352. package/dist/tools/sql.d.ts +1 -1
  353. package/dist/tools/sql.d.ts.map +1 -1
  354. package/dist/tools/sql.js +1 -2
  355. package/dist/tools/sql.js.map +1 -1
  356. package/dist/tools/vectorstore.d.cts +1 -1
  357. package/dist/tools/webbrowser.d.cts +1 -1
  358. package/dist/types/expression-parser.d.cts +2 -0
  359. package/dist/types/expression-parser.d.cts.map +1 -1
  360. package/dist/types/expression-parser.d.ts +2 -0
  361. package/dist/types/expression-parser.d.ts.map +1 -1
  362. package/dist/util/hub.cjs +1 -1
  363. package/dist/util/hub.js +1 -1
  364. package/dist/util/openapi.cjs +1 -1
  365. package/dist/util/openapi.cjs.map +1 -1
  366. package/dist/util/openapi.js +1 -1
  367. package/dist/util/openapi.js.map +1 -1
  368. package/package.json +21 -16
  369. package/dist/chains/openai_functions/structured_output.cjs +0 -107
  370. package/dist/chains/openai_functions/structured_output.cjs.map +0 -1
  371. package/dist/chains/openai_functions/structured_output.d.cts +0 -38
  372. package/dist/chains/openai_functions/structured_output.d.cts.map +0 -1
  373. package/dist/chains/openai_functions/structured_output.d.ts +0 -38
  374. package/dist/chains/openai_functions/structured_output.d.ts.map +0 -1
  375. package/dist/chains/openai_functions/structured_output.js +0 -105
  376. package/dist/chains/openai_functions/structured_output.js.map +0 -1
  377. package/dist/chains/openai_moderation.cjs +0 -107
  378. package/dist/chains/openai_moderation.cjs.map +0 -1
  379. package/dist/chains/openai_moderation.d.cts +0 -74
  380. package/dist/chains/openai_moderation.d.cts.map +0 -1
  381. package/dist/chains/openai_moderation.d.ts +0 -74
  382. package/dist/chains/openai_moderation.d.ts.map +0 -1
  383. package/dist/chains/openai_moderation.js +0 -106
  384. package/dist/chains/openai_moderation.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hitl.d.ts","names":["z","contextSchema","ZodString","ZodBoolean","ZodOptional","ZodTypeAny","ZodObject","ZodRecord","ZodDefault","Record","humanInTheLoopMiddleware","input","___types_js0","AgentMiddleware"],"sources":["../../../../src/agents/middlewareAgent/middleware/hitl.d.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from \"zod/v3\";\ndeclare const contextSchema: z.ZodObject<{\n toolConfigs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{\n requireApproval: z.ZodOptional<z.ZodBoolean>;\n description: z.ZodOptional<z.ZodString>;\n }, \"strip\", z.ZodTypeAny, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }>>>;\n messagePrefix: z.ZodDefault<z.ZodString>;\n}, \"strip\", z.ZodTypeAny, {\n toolConfigs: Record<string, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }>;\n messagePrefix: string;\n}, {\n toolConfigs?: Record<string, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }> | undefined;\n messagePrefix?: string | undefined;\n}>;\n/**\n * Creates a Human-in-the-Loop (HITL) middleware for tool approval and oversight.\n *\n * This middleware intercepts tool calls made by an AI agent and provides human oversight\n * capabilities before execution. It enables selective approval workflows where certain tools\n * require human intervention while others can execute automatically.\n *\n * ## Features\n *\n * - **Selective Tool Approval**: Configure which tools require human approval\n * - **Multiple Response Types**: Accept, edit, ignore, or manually respond to tool calls\n * - **Asynchronous Workflow**: Uses LangGraph's interrupt mechanism for non-blocking approval\n * - **Custom Approval Messages**: Provide context-specific descriptions for approval requests\n *\n * ## Response Types\n *\n * When a tool requires approval, the human operator can respond with:\n * - `accept`: Execute the tool with original arguments\n * - `edit`: Modify the tool arguments before execution\n * - `ignore`: Skip the tool and terminate the agent\n * - `response`: Provide a manual response instead of executing the tool\n *\n * @param options - Configuration options for the middleware\n * @param options.toolConfigs - Per-tool configuration mapping tool names to their settings\n * @param options.toolConfigs[toolName].requireApproval - Whether the tool requires human approval\n * @param options.toolConfigs[toolName].description - Custom approval message for the tool\n * @param options.messagePrefix - Default prefix for approval messages (default: \"Tool execution requires approval\")\n *\n * @returns A middleware instance that can be passed to `createAgent`\n *\n * @example\n * Basic usage with selective tool approval\n * ```typescript\n * import { humanInTheLoopMiddleware } from \"langchain/middleware\";\n * import { createAgent } from \"langchain\";\n *\n * const hitlMiddleware = humanInTheLoopMiddleware({\n * toolConfigs: {\n * \"write_file\": {\n * requireApproval: true,\n * description: \"⚠️ File write operation requires approval\"\n * },\n * \"read_file\": {\n * requireApproval: false // Safe operation, no approval needed\n * }\n * }\n * });\n *\n * const agent = createAgent({\n * model: \"openai:gpt-4\",\n * tools: [writeFileTool, readFileTool],\n * middleware: [hitlMiddleware]\n * });\n * ```\n *\n * @example\n * Handling approval requests\n * ```typescript\n * import { Command } from \"@langchain/langgraph\";\n *\n * // Initial agent invocation\n * const result = await agent.invoke({\n * messages: [new HumanMessage(\"Write 'Hello' to output.txt\")]\n * }, config);\n *\n * // Check if agent is paused for approval\n * const state = await agent.graph.getState(config);\n * if (state.next?.length > 0) {\n * // Get interrupt details\n * const task = state.tasks?.[0];\n * const requests = task?.interrupts?.[0]?.value;\n *\n * // Show tool call details to user\n * console.log(\"Tool:\", requests[0].action);\n * console.log(\"Args:\", requests[0].args);\n *\n * // Resume with approval\n * await agent.invoke(\n * new Command({ resume: [{ type: \"accept\" }] }),\n * config\n * );\n * }\n * ```\n *\n * @example\n * Different response types\n * ```typescript\n * // Accept the tool call as-is\n * new Command({ resume: [{ type: \"accept\" }] })\n *\n * // Edit the tool arguments\n * new Command({\n * resume: [{\n * type: \"edit\",\n * args: { action: \"write_file\", args: { filename: \"safe.txt\", content: \"Modified\" } }\n * }]\n * })\n *\n * // Skip tool and terminate agent\n * new Command({ resume: [{ type: \"ignore\" }] })\n *\n * // Provide manual response\n * new Command({\n * resume: [{\n * type: \"response\",\n * args: \"File operation not allowed in demo mode\"\n * }]\n * })\n * ```\n *\n * @example\n * Production use case with database operations\n * ```typescript\n * const hitlMiddleware = humanInTheLoopMiddleware({\n * toolConfigs: {\n * \"execute_sql\": {\n * requireApproval: true,\n * description: \"🚨 SQL query requires DBA approval\\nPlease review for safety and performance\"\n * },\n * \"read_schema\": {\n * requireApproval: false // Reading metadata is safe\n * },\n * \"delete_records\": {\n * requireApproval: true,\n * description: \"⛔ DESTRUCTIVE OPERATION - Requires manager approval\"\n * }\n * },\n * messagePrefix: \"Database operation pending approval\"\n * });\n * ```\n *\n * @remarks\n * - Tool calls are processed in the order they appear in the AI message\n * - Auto-approved tools execute immediately without interruption\n * - Multiple tools requiring approval are bundled into a single interrupt\n * - The middleware operates in the `afterModel` phase, intercepting before tool execution\n * - Requires a checkpointer to maintain state across interruptions\n *\n * @see {@link createAgent} for agent creation\n * @see {@link Command} for resuming interrupted execution\n * @public\n */\nexport declare function humanInTheLoopMiddleware(options?: z.input<typeof contextSchema>): import(\"../types.js\").AgentMiddleware<undefined, z.ZodObject<{\n toolConfigs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{\n requireApproval: z.ZodOptional<z.ZodBoolean>;\n description: z.ZodOptional<z.ZodString>;\n }, \"strip\", z.ZodTypeAny, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }>>>;\n messagePrefix: z.ZodDefault<z.ZodString>;\n}, \"strip\", z.ZodTypeAny, {\n toolConfigs: Record<string, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }>;\n messagePrefix: string;\n}, {\n toolConfigs?: Record<string, {\n requireApproval?: boolean | undefined;\n description?: string | undefined;\n }> | undefined;\n messagePrefix?: string | undefined;\n}>, any>;\nexport {};\n"],"mappings":";;;;cAEcC,eAAeD,CAAAA,CAAEM;eACdN,CAAAA,CAAEQ,WAAWR,CAAAA,CAAEO,UAAUP,CAAAA,CAAEE,WAAWF,CAAAA,CAAEM;IAD3CL,eAwBZ,EAtBuBD,CAAAA,CAAEI,WAsBzB,CAtBqCJ,CAAAA,CAAEG,UAsBvC,CAAA;IAAA,WAAA,EArBmBH,CAAAA,CAAEI,WAqBrB,CArBiCJ,CAAAA,CAAEE,SAqBnC,CAAA;EAAA,CAAA,EAvBwCF,OAAEE,EAG5BF,CAAAA,CAAEK,UAH0BH,EAAAA;IACLF,eAAEG,CAAAA,EAAAA,OAAAA,GAAAA,SAAAA;IAAhBH,WAAEI,CAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EAAW,CAAA,EACHJ;IAAdA,eAAEI,CAAAA,EAAAA,OAAAA,GAAAA,SAAAA;IACPJ,WAAEK,CAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EAAU,CAAA,CAAA,CAH2BL,CAAAA;EAAW,aAAlCO,EAUbP,CAAAA,CAAEQ,UAVWD,CAUAP,CAAAA,CAAEE,SAVFK,CAAAA;CAAS,EAAA,OAAtBC,EAWPR,CAAAA,CAAEK,UAXKG,EAAAA;EAAU,WAUKN,EAEjBO,MAFiBP,CAAAA,MAAAA,EAAAA;IAAfF,eAAEQ,CAAAA,EAAAA,OAAAA,GAAAA,SAAAA;IACTR,WAAEK,CAAAA,EAAAA,MAAAA,GAAAA,SAAAA;EAAU,CAAA,CAAA;EACD,aAMLI,EAAAA,MAAAA;CAAM,EAAA;EAnBgB,WAAA,CAAA,EAmBtBA,MAnBsB,CAAA,MAAA,EAAA;IAuKhBC,eAAAA,CAAAA,EAAAA,OAAwB,GAAA,SAAA;IAAA,WAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAA,CAAA,CAAA,GAA0BT,SAAAA;EAAa,aAA1BU,CAAAA,EAAAA,MAAAA,GAAAA,SAAAA;CAAK,CAAA;;;;;;;;;;;;;;;;AAA8D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAxGD,wBAAAA,WAAmCV,CAAAA,CAAEW,aAAaV,iBAA6E,2BAAXD,CAAAA,CAAEM;eAC7HN,CAAAA,CAAEQ,WAAWR,CAAAA,CAAEO,UAAUP,CAAAA,CAAEE,WAAWF,CAAAA,CAAEM;qBAChCN,CAAAA,CAAEI,YAAYJ,CAAAA,CAAEG;iBACpBH,CAAAA,CAAEI,YAAYJ,CAAAA,CAAEE;cACrBF,CAAAA,CAAEK;;;;;;;iBAOCL,CAAAA,CAAEQ,WAAWR,CAAAA,CAAEE;YACtBF,CAAAA,CAAEK;eACGI;;;;;;gBAMCA"}
@@ -0,0 +1,234 @@
1
+ import { createMiddleware } from "../middleware.js";
2
+ import { AIMessage, ToolMessage, isAIMessage } from "@langchain/core/messages";
3
+ import { interrupt } from "@langchain/langgraph";
4
+ import { z } from "zod/v3";
5
+ import { v4 } from "uuid";
6
+
7
+ //#region src/agents/middlewareAgent/middleware/hitl.ts
8
+ const contextSchema = z.object({
9
+ toolConfigs: z.record(z.object({
10
+ requireApproval: z.boolean().optional(),
11
+ description: z.string().optional()
12
+ })).default({}),
13
+ messagePrefix: z.string().default("Tool execution requires approval")
14
+ });
15
+ /**
16
+ * Creates a Human-in-the-Loop (HITL) middleware for tool approval and oversight.
17
+ *
18
+ * This middleware intercepts tool calls made by an AI agent and provides human oversight
19
+ * capabilities before execution. It enables selective approval workflows where certain tools
20
+ * require human intervention while others can execute automatically.
21
+ *
22
+ * ## Features
23
+ *
24
+ * - **Selective Tool Approval**: Configure which tools require human approval
25
+ * - **Multiple Response Types**: Accept, edit, ignore, or manually respond to tool calls
26
+ * - **Asynchronous Workflow**: Uses LangGraph's interrupt mechanism for non-blocking approval
27
+ * - **Custom Approval Messages**: Provide context-specific descriptions for approval requests
28
+ *
29
+ * ## Response Types
30
+ *
31
+ * When a tool requires approval, the human operator can respond with:
32
+ * - `accept`: Execute the tool with original arguments
33
+ * - `edit`: Modify the tool arguments before execution
34
+ * - `ignore`: Skip the tool and terminate the agent
35
+ * - `response`: Provide a manual response instead of executing the tool
36
+ *
37
+ * @param options - Configuration options for the middleware
38
+ * @param options.toolConfigs - Per-tool configuration mapping tool names to their settings
39
+ * @param options.toolConfigs[toolName].requireApproval - Whether the tool requires human approval
40
+ * @param options.toolConfigs[toolName].description - Custom approval message for the tool
41
+ * @param options.messagePrefix - Default prefix for approval messages (default: "Tool execution requires approval")
42
+ *
43
+ * @returns A middleware instance that can be passed to `createAgent`
44
+ *
45
+ * @example
46
+ * Basic usage with selective tool approval
47
+ * ```typescript
48
+ * import { humanInTheLoopMiddleware } from "langchain/middleware";
49
+ * import { createAgent } from "langchain";
50
+ *
51
+ * const hitlMiddleware = humanInTheLoopMiddleware({
52
+ * toolConfigs: {
53
+ * "write_file": {
54
+ * requireApproval: true,
55
+ * description: "⚠️ File write operation requires approval"
56
+ * },
57
+ * "read_file": {
58
+ * requireApproval: false // Safe operation, no approval needed
59
+ * }
60
+ * }
61
+ * });
62
+ *
63
+ * const agent = createAgent({
64
+ * model: "openai:gpt-4",
65
+ * tools: [writeFileTool, readFileTool],
66
+ * middleware: [hitlMiddleware]
67
+ * });
68
+ * ```
69
+ *
70
+ * @example
71
+ * Handling approval requests
72
+ * ```typescript
73
+ * import { Command } from "@langchain/langgraph";
74
+ *
75
+ * // Initial agent invocation
76
+ * const result = await agent.invoke({
77
+ * messages: [new HumanMessage("Write 'Hello' to output.txt")]
78
+ * }, config);
79
+ *
80
+ * // Check if agent is paused for approval
81
+ * const state = await agent.graph.getState(config);
82
+ * if (state.next?.length > 0) {
83
+ * // Get interrupt details
84
+ * const task = state.tasks?.[0];
85
+ * const requests = task?.interrupts?.[0]?.value;
86
+ *
87
+ * // Show tool call details to user
88
+ * console.log("Tool:", requests[0].action);
89
+ * console.log("Args:", requests[0].args);
90
+ *
91
+ * // Resume with approval
92
+ * await agent.invoke(
93
+ * new Command({ resume: [{ type: "accept" }] }),
94
+ * config
95
+ * );
96
+ * }
97
+ * ```
98
+ *
99
+ * @example
100
+ * Different response types
101
+ * ```typescript
102
+ * // Accept the tool call as-is
103
+ * new Command({ resume: [{ type: "accept" }] })
104
+ *
105
+ * // Edit the tool arguments
106
+ * new Command({
107
+ * resume: [{
108
+ * type: "edit",
109
+ * args: { action: "write_file", args: { filename: "safe.txt", content: "Modified" } }
110
+ * }]
111
+ * })
112
+ *
113
+ * // Skip tool and terminate agent
114
+ * new Command({ resume: [{ type: "ignore" }] })
115
+ *
116
+ * // Provide manual response
117
+ * new Command({
118
+ * resume: [{
119
+ * type: "response",
120
+ * args: "File operation not allowed in demo mode"
121
+ * }]
122
+ * })
123
+ * ```
124
+ *
125
+ * @example
126
+ * Production use case with database operations
127
+ * ```typescript
128
+ * const hitlMiddleware = humanInTheLoopMiddleware({
129
+ * toolConfigs: {
130
+ * "execute_sql": {
131
+ * requireApproval: true,
132
+ * description: "🚨 SQL query requires DBA approval\nPlease review for safety and performance"
133
+ * },
134
+ * "read_schema": {
135
+ * requireApproval: false // Reading metadata is safe
136
+ * },
137
+ * "delete_records": {
138
+ * requireApproval: true,
139
+ * description: "⛔ DESTRUCTIVE OPERATION - Requires manager approval"
140
+ * }
141
+ * },
142
+ * messagePrefix: "Database operation pending approval"
143
+ * });
144
+ * ```
145
+ *
146
+ * @remarks
147
+ * - Tool calls are processed in the order they appear in the AI message
148
+ * - Auto-approved tools execute immediately without interruption
149
+ * - Multiple tools requiring approval are bundled into a single interrupt
150
+ * - The middleware operates in the `afterModel` phase, intercepting before tool execution
151
+ * - Requires a checkpointer to maintain state across interruptions
152
+ *
153
+ * @see {@link createAgent} for agent creation
154
+ * @see {@link Command} for resuming interrupted execution
155
+ * @public
156
+ */
157
+ function humanInTheLoopMiddleware(options = {}) {
158
+ return createMiddleware({
159
+ name: "HumanInTheLoopMiddleware",
160
+ contextSchema,
161
+ afterModel: async (state, runtime, controls) => {
162
+ const config = {
163
+ ...contextSchema.parse(options),
164
+ ...runtime.context
165
+ };
166
+ const { messages } = state;
167
+ if (!messages.length) return;
168
+ const lastMessage = messages[messages.length - 1];
169
+ if (!isAIMessage(lastMessage) || !lastMessage.tool_calls?.length) return;
170
+ const interruptToolCalls = [];
171
+ const autoApprovedToolCalls = [];
172
+ for (const toolCall of lastMessage.tool_calls) {
173
+ const normalizedToolCall = {
174
+ id: toolCall.id || v4(),
175
+ name: toolCall.name,
176
+ args: toolCall.args
177
+ };
178
+ const toolConfig = config.toolConfigs[normalizedToolCall.name];
179
+ if (toolConfig?.requireApproval) interruptToolCalls.push(normalizedToolCall);
180
+ else autoApprovedToolCalls.push(normalizedToolCall);
181
+ }
182
+ if (!interruptToolCalls.length) return;
183
+ const approvedToolCalls = [...autoApprovedToolCalls];
184
+ const requests = interruptToolCalls.map((toolCall) => {
185
+ const toolConfig = config.toolConfigs[toolCall.name];
186
+ const description = toolConfig?.description || `${config.messagePrefix}\n\nTool: ${toolCall.name}\nArgs: ${JSON.stringify(toolCall.args, null, 2)}`;
187
+ return {
188
+ action: toolCall.name,
189
+ args: toolCall.args,
190
+ toolCallId: toolCall.id,
191
+ description
192
+ };
193
+ });
194
+ const responses = await interrupt(requests);
195
+ for (let i = 0; i < responses.length; i++) {
196
+ const response = responses[i];
197
+ const toolCall = interruptToolCalls[i];
198
+ switch (response.type) {
199
+ case "accept":
200
+ approvedToolCalls.push(toolCall);
201
+ break;
202
+ case "edit":
203
+ if (response.args && typeof response.args === "object" && "args" in response.args) approvedToolCalls.push({
204
+ ...toolCall,
205
+ args: response.args.args
206
+ });
207
+ break;
208
+ case "ignore": return controls.terminate();
209
+ case "response": {
210
+ const toolMessage = new ToolMessage({
211
+ content: typeof response.args === "string" ? response.args : "",
212
+ tool_call_id: toolCall.id
213
+ });
214
+ return {
215
+ messages: [...state.messages, toolMessage],
216
+ jump_to: "model"
217
+ };
218
+ }
219
+ default: throw new Error(`Unknown response type: ${response.type}`);
220
+ }
221
+ }
222
+ const updatedMessage = new AIMessage({
223
+ content: lastMessage.content,
224
+ tool_calls: approvedToolCalls,
225
+ id: lastMessage.id
226
+ });
227
+ return { messages: [...state.messages.slice(0, -1), updatedMessage] };
228
+ }
229
+ });
230
+ }
231
+
232
+ //#endregion
233
+ export { humanInTheLoopMiddleware };
234
+ //# sourceMappingURL=hitl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hitl.js","names":["options: z.input<typeof contextSchema>","interruptToolCalls: ToolCall[]","autoApprovedToolCalls: ToolCall[]","normalizedToolCall: ToolCall","uuid","requests: ToolApprovalRequest[]"],"sources":["../../../../src/agents/middlewareAgent/middleware/hitl.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from \"zod/v3\";\nimport { v4 as uuid } from \"uuid\";\nimport { AIMessage, ToolMessage, isAIMessage } from \"@langchain/core/messages\";\nimport { interrupt } from \"@langchain/langgraph\";\n\nimport { createMiddleware } from \"../middleware.js\";\nimport type { ToolCall } from \"../types.js\";\nimport { HumanResponse } from \"../../interrupt.js\";\n\n/**\n * Interrupt request for tool approval\n */\ninterface ToolApprovalRequest {\n action: string;\n args: Record<string, any>;\n toolCallId: string;\n description?: string;\n}\n\nconst contextSchema = z.object({\n toolConfigs: z\n .record(\n z.object({\n requireApproval: z.boolean().optional(),\n description: z.string().optional(),\n })\n )\n .default({}),\n messagePrefix: z.string().default(\"Tool execution requires approval\"),\n});\n\n/**\n * Creates a Human-in-the-Loop (HITL) middleware for tool approval and oversight.\n *\n * This middleware intercepts tool calls made by an AI agent and provides human oversight\n * capabilities before execution. It enables selective approval workflows where certain tools\n * require human intervention while others can execute automatically.\n *\n * ## Features\n *\n * - **Selective Tool Approval**: Configure which tools require human approval\n * - **Multiple Response Types**: Accept, edit, ignore, or manually respond to tool calls\n * - **Asynchronous Workflow**: Uses LangGraph's interrupt mechanism for non-blocking approval\n * - **Custom Approval Messages**: Provide context-specific descriptions for approval requests\n *\n * ## Response Types\n *\n * When a tool requires approval, the human operator can respond with:\n * - `accept`: Execute the tool with original arguments\n * - `edit`: Modify the tool arguments before execution\n * - `ignore`: Skip the tool and terminate the agent\n * - `response`: Provide a manual response instead of executing the tool\n *\n * @param options - Configuration options for the middleware\n * @param options.toolConfigs - Per-tool configuration mapping tool names to their settings\n * @param options.toolConfigs[toolName].requireApproval - Whether the tool requires human approval\n * @param options.toolConfigs[toolName].description - Custom approval message for the tool\n * @param options.messagePrefix - Default prefix for approval messages (default: \"Tool execution requires approval\")\n *\n * @returns A middleware instance that can be passed to `createAgent`\n *\n * @example\n * Basic usage with selective tool approval\n * ```typescript\n * import { humanInTheLoopMiddleware } from \"langchain/middleware\";\n * import { createAgent } from \"langchain\";\n *\n * const hitlMiddleware = humanInTheLoopMiddleware({\n * toolConfigs: {\n * \"write_file\": {\n * requireApproval: true,\n * description: \"⚠️ File write operation requires approval\"\n * },\n * \"read_file\": {\n * requireApproval: false // Safe operation, no approval needed\n * }\n * }\n * });\n *\n * const agent = createAgent({\n * model: \"openai:gpt-4\",\n * tools: [writeFileTool, readFileTool],\n * middleware: [hitlMiddleware]\n * });\n * ```\n *\n * @example\n * Handling approval requests\n * ```typescript\n * import { Command } from \"@langchain/langgraph\";\n *\n * // Initial agent invocation\n * const result = await agent.invoke({\n * messages: [new HumanMessage(\"Write 'Hello' to output.txt\")]\n * }, config);\n *\n * // Check if agent is paused for approval\n * const state = await agent.graph.getState(config);\n * if (state.next?.length > 0) {\n * // Get interrupt details\n * const task = state.tasks?.[0];\n * const requests = task?.interrupts?.[0]?.value;\n *\n * // Show tool call details to user\n * console.log(\"Tool:\", requests[0].action);\n * console.log(\"Args:\", requests[0].args);\n *\n * // Resume with approval\n * await agent.invoke(\n * new Command({ resume: [{ type: \"accept\" }] }),\n * config\n * );\n * }\n * ```\n *\n * @example\n * Different response types\n * ```typescript\n * // Accept the tool call as-is\n * new Command({ resume: [{ type: \"accept\" }] })\n *\n * // Edit the tool arguments\n * new Command({\n * resume: [{\n * type: \"edit\",\n * args: { action: \"write_file\", args: { filename: \"safe.txt\", content: \"Modified\" } }\n * }]\n * })\n *\n * // Skip tool and terminate agent\n * new Command({ resume: [{ type: \"ignore\" }] })\n *\n * // Provide manual response\n * new Command({\n * resume: [{\n * type: \"response\",\n * args: \"File operation not allowed in demo mode\"\n * }]\n * })\n * ```\n *\n * @example\n * Production use case with database operations\n * ```typescript\n * const hitlMiddleware = humanInTheLoopMiddleware({\n * toolConfigs: {\n * \"execute_sql\": {\n * requireApproval: true,\n * description: \"🚨 SQL query requires DBA approval\\nPlease review for safety and performance\"\n * },\n * \"read_schema\": {\n * requireApproval: false // Reading metadata is safe\n * },\n * \"delete_records\": {\n * requireApproval: true,\n * description: \"⛔ DESTRUCTIVE OPERATION - Requires manager approval\"\n * }\n * },\n * messagePrefix: \"Database operation pending approval\"\n * });\n * ```\n *\n * @remarks\n * - Tool calls are processed in the order they appear in the AI message\n * - Auto-approved tools execute immediately without interruption\n * - Multiple tools requiring approval are bundled into a single interrupt\n * - The middleware operates in the `afterModel` phase, intercepting before tool execution\n * - Requires a checkpointer to maintain state across interruptions\n *\n * @see {@link createAgent} for agent creation\n * @see {@link Command} for resuming interrupted execution\n * @public\n */\nexport function humanInTheLoopMiddleware(\n options: z.input<typeof contextSchema> = {}\n) {\n return createMiddleware({\n name: \"HumanInTheLoopMiddleware\",\n contextSchema,\n afterModel: async (state, runtime, controls) => {\n const config = { ...contextSchema.parse(options), ...runtime.context };\n const { messages } = state;\n\n if (!messages.length) {\n return;\n }\n\n const lastMessage = messages[messages.length - 1];\n\n // Check if it's an AI message with tool calls\n if (!isAIMessage(lastMessage) || !lastMessage.tool_calls?.length) {\n return;\n }\n\n // Separate tool calls that need interrupts from those that don't\n const interruptToolCalls: ToolCall[] = [];\n const autoApprovedToolCalls: ToolCall[] = [];\n\n for (const toolCall of lastMessage.tool_calls) {\n // Ensure tool call has an ID\n const normalizedToolCall: ToolCall = {\n id: toolCall.id || uuid(),\n name: toolCall.name,\n args: toolCall.args,\n };\n\n const toolConfig = config.toolConfigs[normalizedToolCall.name];\n\n if (toolConfig?.requireApproval) {\n interruptToolCalls.push(normalizedToolCall);\n } else {\n autoApprovedToolCalls.push(normalizedToolCall);\n }\n }\n\n // If no interrupts needed, return early\n if (!interruptToolCalls.length) {\n return;\n }\n\n const approvedToolCalls = [...autoApprovedToolCalls];\n\n // Process tool calls that need interrupts\n const requests: ToolApprovalRequest[] = interruptToolCalls.map(\n (toolCall) => {\n const toolConfig = config.toolConfigs[toolCall.name];\n const description =\n toolConfig?.description ||\n `${config.messagePrefix}\\n\\nTool: ${\n toolCall.name\n }\\nArgs: ${JSON.stringify(toolCall.args, null, 2)}`;\n\n return {\n action: toolCall.name,\n args: toolCall.args,\n toolCallId: toolCall.id,\n description,\n };\n }\n );\n\n // Interrupt and wait for human responses\n const responses = (await interrupt(requests)) as HumanResponse[];\n\n // Process responses\n for (let i = 0; i < responses.length; i++) {\n const response = responses[i];\n const toolCall = interruptToolCalls[i];\n\n switch (response.type) {\n case \"accept\":\n approvedToolCalls.push(toolCall);\n break;\n\n case \"edit\":\n // For edit, args is an ActionRequest with updated args\n if (\n response.args &&\n typeof response.args === \"object\" &&\n \"args\" in response.args\n ) {\n approvedToolCalls.push({\n ...toolCall,\n args: (\n response.args as { action: string; args: Record<string, any> }\n ).args,\n });\n }\n break;\n\n case \"ignore\":\n // Skip to end - terminate the agent\n return controls.terminate();\n\n case \"response\": {\n // Return manual tool response and jump back to model\n // For response, args is a string\n const toolMessage = new ToolMessage({\n content: typeof response.args === \"string\" ? response.args : \"\",\n tool_call_id: toolCall.id,\n });\n return {\n messages: [...state.messages, toolMessage],\n jump_to: \"model\",\n };\n }\n default:\n throw new Error(`Unknown response type: ${(response as any).type}`);\n }\n }\n\n // Update the last message with approved tool calls\n const updatedMessage = new AIMessage({\n content: lastMessage.content,\n tool_calls: approvedToolCalls,\n id: lastMessage.id,\n });\n\n // Replace the last message with the updated one\n return {\n messages: [...state.messages.slice(0, -1), updatedMessage],\n };\n },\n });\n}\n"],"mappings":";;;;;;;AAoBA,MAAM,gBAAgB,EAAE,OAAO;CAC7B,aAAa,EACV,OACC,EAAE,OAAO;EACP,iBAAiB,EAAE,SAAS,CAAC,UAAU;EACvC,aAAa,EAAE,QAAQ,CAAC,UAAU;CACnC,EAAC,CACH,CACA,QAAQ,CAAE,EAAC;CACd,eAAe,EAAE,QAAQ,CAAC,QAAQ,mCAAmC;AACtE,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgJF,SAAgB,yBACdA,UAAyC,CAAE,GAC3C;AACA,QAAO,iBAAiB;EACtB,MAAM;EACN;EACA,YAAY,OAAO,OAAO,SAAS,aAAa;GAC9C,MAAM,SAAS;IAAE,GAAG,cAAc,MAAM,QAAQ;IAAE,GAAG,QAAQ;GAAS;GACtE,MAAM,EAAE,UAAU,GAAG;AAErB,OAAI,CAAC,SAAS,OACZ;GAGF,MAAM,cAAc,SAAS,SAAS,SAAS;AAG/C,OAAI,CAAC,YAAY,YAAY,IAAI,CAAC,YAAY,YAAY,OACxD;GAIF,MAAMC,qBAAiC,CAAE;GACzC,MAAMC,wBAAoC,CAAE;AAE5C,QAAK,MAAM,YAAY,YAAY,YAAY;IAE7C,MAAMC,qBAA+B;KACnC,IAAI,SAAS,MAAMC,IAAM;KACzB,MAAM,SAAS;KACf,MAAM,SAAS;IAChB;IAED,MAAM,aAAa,OAAO,YAAY,mBAAmB;AAEzD,QAAI,YAAY,iBACd,mBAAmB,KAAK,mBAAmB;SAE3C,sBAAsB,KAAK,mBAAmB;GAEjD;AAGD,OAAI,CAAC,mBAAmB,OACtB;GAGF,MAAM,oBAAoB,CAAC,GAAG,qBAAsB;GAGpD,MAAMC,WAAkC,mBAAmB,IACzD,CAAC,aAAa;IACZ,MAAM,aAAa,OAAO,YAAY,SAAS;IAC/C,MAAM,cACJ,YAAY,eACZ,GAAG,OAAO,cAAc,UAAU,EAChC,SAAS,KACV,QAAQ,EAAE,KAAK,UAAU,SAAS,MAAM,MAAM,EAAE,EAAE;AAErD,WAAO;KACL,QAAQ,SAAS;KACjB,MAAM,SAAS;KACf,YAAY,SAAS;KACrB;IACD;GACF,EACF;GAGD,MAAM,YAAa,MAAM,UAAU,SAAS;AAG5C,QAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;IACzC,MAAM,WAAW,UAAU;IAC3B,MAAM,WAAW,mBAAmB;AAEpC,YAAQ,SAAS,MAAjB;KACE,KAAK;MACH,kBAAkB,KAAK,SAAS;AAChC;KAEF,KAAK;AAEH,UACE,SAAS,QACT,OAAO,SAAS,SAAS,YACzB,UAAU,SAAS,MAEnB,kBAAkB,KAAK;OACrB,GAAG;OACH,MACE,SAAS,KACT;MACH,EAAC;AAEJ;KAEF,KAAK,SAEH,QAAO,SAAS,WAAW;KAE7B,KAAK,YAAY;MAGf,MAAM,cAAc,IAAI,YAAY;OAClC,SAAS,OAAO,SAAS,SAAS,WAAW,SAAS,OAAO;OAC7D,cAAc,SAAS;MACxB;AACD,aAAO;OACL,UAAU,CAAC,GAAG,MAAM,UAAU,WAAY;OAC1C,SAAS;MACV;KACF;KACD,QACE,OAAM,IAAI,MAAM,CAAC,uBAAuB,EAAG,SAAiB,MAAM;IACrE;GACF;GAGD,MAAM,iBAAiB,IAAI,UAAU;IACnC,SAAS,YAAY;IACrB,YAAY;IACZ,IAAI,YAAY;GACjB;AAGD,UAAO,EACL,UAAU,CAAC,GAAG,MAAM,SAAS,MAAM,GAAG,GAAG,EAAE,cAAe,EAC3D;EACF;CACF,EAAC;AACH"}
@@ -0,0 +1,26 @@
1
+ const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
+ const require_summarization = require('./summarization.cjs');
3
+ const require_hitl = require('./hitl.cjs');
4
+ const require_promptCaching = require('./promptCaching.cjs');
5
+
6
+ //#region src/agents/middlewareAgent/middleware/index.ts
7
+ var middleware_exports = {};
8
+ require_rolldown_runtime.__export(middleware_exports, {
9
+ anthropicPromptCachingMiddleware: () => require_promptCaching.anthropicPromptCachingMiddleware,
10
+ countTokensApproximately: () => require_summarization.countTokensApproximately,
11
+ humanInTheLoopMiddleware: () => require_hitl.humanInTheLoopMiddleware,
12
+ summarizationMiddleware: () => require_summarization.summarizationMiddleware
13
+ });
14
+
15
+ //#endregion
16
+ exports.anthropicPromptCachingMiddleware = require_promptCaching.anthropicPromptCachingMiddleware;
17
+ exports.countTokensApproximately = require_summarization.countTokensApproximately;
18
+ exports.humanInTheLoopMiddleware = require_hitl.humanInTheLoopMiddleware;
19
+ Object.defineProperty(exports, 'middleware_exports', {
20
+ enumerable: true,
21
+ get: function () {
22
+ return middleware_exports;
23
+ }
24
+ });
25
+ exports.summarizationMiddleware = require_summarization.summarizationMiddleware;
26
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/agents/middlewareAgent/middleware/index.ts"],"sourcesContent":["export {\n summarizationMiddleware,\n countTokensApproximately,\n} from \"./summarization.js\";\nexport { humanInTheLoopMiddleware } from \"./hitl.js\";\nexport { anthropicPromptCachingMiddleware } from \"./promptCaching.js\";\n"],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { countTokensApproximately, summarizationMiddleware } from "./summarization.cjs";
2
+ import { humanInTheLoopMiddleware } from "./hitl.cjs";
3
+ import { anthropicPromptCachingMiddleware } from "./promptCaching.cjs";
4
+ export { anthropicPromptCachingMiddleware, countTokensApproximately, humanInTheLoopMiddleware, summarizationMiddleware };
@@ -0,0 +1,4 @@
1
+ import { countTokensApproximately, summarizationMiddleware } from "./summarization.js";
2
+ import { humanInTheLoopMiddleware } from "./hitl.js";
3
+ import { anthropicPromptCachingMiddleware } from "./promptCaching.js";
4
+ export { anthropicPromptCachingMiddleware, countTokensApproximately, humanInTheLoopMiddleware, summarizationMiddleware };
@@ -0,0 +1,17 @@
1
+ import { __export } from "../../../_virtual/rolldown_runtime.js";
2
+ import { countTokensApproximately, summarizationMiddleware } from "./summarization.js";
3
+ import { humanInTheLoopMiddleware } from "./hitl.js";
4
+ import { anthropicPromptCachingMiddleware } from "./promptCaching.js";
5
+
6
+ //#region src/agents/middlewareAgent/middleware/index.ts
7
+ var middleware_exports = {};
8
+ __export(middleware_exports, {
9
+ anthropicPromptCachingMiddleware: () => anthropicPromptCachingMiddleware,
10
+ countTokensApproximately: () => countTokensApproximately,
11
+ humanInTheLoopMiddleware: () => humanInTheLoopMiddleware,
12
+ summarizationMiddleware: () => summarizationMiddleware
13
+ });
14
+
15
+ //#endregion
16
+ export { anthropicPromptCachingMiddleware, countTokensApproximately, humanInTheLoopMiddleware, middleware_exports, summarizationMiddleware };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/agents/middlewareAgent/middleware/index.ts"],"sourcesContent":["export {\n summarizationMiddleware,\n countTokensApproximately,\n} from \"./summarization.js\";\nexport { humanInTheLoopMiddleware } from \"./hitl.js\";\nexport { anthropicPromptCachingMiddleware } from \"./promptCaching.js\";\n"],"mappings":""}
@@ -0,0 +1,182 @@
1
+ const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
+ const require_middleware = require('../middleware.cjs');
3
+ const zod_v3 = require_rolldown_runtime.__toESM(require("zod/v3"));
4
+
5
+ //#region src/agents/middlewareAgent/middleware/promptCaching.ts
6
+ const DEFAULT_ENABLE_CACHING = true;
7
+ const DEFAULT_TTL = "5m";
8
+ const DEFAULT_MIN_MESSAGES_TO_CACHE = 3;
9
+ const contextSchema = zod_v3.z.object({
10
+ enableCaching: zod_v3.z.boolean().default(DEFAULT_ENABLE_CACHING),
11
+ ttl: zod_v3.z.enum(["5m", "1h"]).default(DEFAULT_TTL),
12
+ minMessagesToCache: zod_v3.z.number().default(DEFAULT_MIN_MESSAGES_TO_CACHE)
13
+ });
14
+ var PromptCachingMiddlewareError = class extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "PromptCachingMiddlewareError";
18
+ }
19
+ };
20
+ /**
21
+ * Creates a prompt caching middleware for Anthropic models to optimize API usage.
22
+ *
23
+ * This middleware automatically adds cache control headers to the last messages when using Anthropic models,
24
+ * enabling their prompt caching feature. This can significantly reduce costs for applications with repetitive
25
+ * prompts, long system messages, or extensive conversation histories.
26
+ *
27
+ * ## How It Works
28
+ *
29
+ * The middleware intercepts model requests and adds cache control metadata that tells Anthropic's
30
+ * API to cache processed prompt prefixes. On subsequent requests with matching prefixes, the
31
+ * cached representations are reused, skipping redundant token processing.
32
+ *
33
+ * ## Benefits
34
+ *
35
+ * - **Cost Reduction**: Avoid reprocessing the same tokens repeatedly (up to 90% savings on cached portions)
36
+ * - **Lower Latency**: Cached prompts are processed faster as embeddings are pre-computed
37
+ * - **Better Scalability**: Reduced computational load enables handling more requests
38
+ * - **Consistent Performance**: Stable response times for repetitive queries
39
+ *
40
+ * @param middlewareOptions - Configuration options for the caching behavior
41
+ * @param middlewareOptions.enableCaching - Whether to enable prompt caching (default: `true`)
42
+ * @param middlewareOptions.ttl - Cache time-to-live: `"5m"` for 5 minutes or `"1h"` for 1 hour (default: `"5m"`)
43
+ * @param middlewareOptions.minMessagesToCache - Minimum number of messages required before caching is applied (default: `3`)
44
+ *
45
+ * @returns A middleware instance that can be passed to `createAgent`
46
+ *
47
+ * @throws {Error} If used with non-Anthropic models
48
+ *
49
+ * @example
50
+ * Basic usage with default settings
51
+ * ```typescript
52
+ * import { createAgent } from "langchain";
53
+ * import { anthropicPromptCachingMiddleware } from "langchain/middleware";
54
+ *
55
+ * const agent = createAgent({
56
+ * model: "anthropic:claude-3-5-sonnet",
57
+ * middleware: [
58
+ * anthropicPromptCachingMiddleware()
59
+ * ]
60
+ * });
61
+ * ```
62
+ *
63
+ * @example
64
+ * Custom configuration for longer conversations
65
+ * ```typescript
66
+ * const cachingMiddleware = anthropicPromptCachingMiddleware({
67
+ * ttl: "1h", // Cache for 1 hour instead of default 5 minutes
68
+ * minMessagesToCache: 5 // Only cache after 5 messages
69
+ * });
70
+ *
71
+ * const agent = createAgent({
72
+ * model: "anthropic:claude-3-5-sonnet",
73
+ * systemMessage: "You are a helpful assistant with deep knowledge of...", // Long system prompt
74
+ * middleware: [cachingMiddleware]
75
+ * });
76
+ * ```
77
+ *
78
+ * @example
79
+ * Conditional caching based on runtime context
80
+ * ```typescript
81
+ * const agent = createAgent({
82
+ * model: "anthropic:claude-3-5-sonnet",
83
+ * middleware: [
84
+ * anthropicPromptCachingMiddleware({
85
+ * enableCaching: true,
86
+ * ttl: "5m"
87
+ * })
88
+ * ]
89
+ * });
90
+ *
91
+ * // Disable caching for specific requests
92
+ * await agent.invoke(
93
+ * { messages: [new HumanMessage("Process this without caching")] },
94
+ * {
95
+ * configurable: {
96
+ * middleware_context: { enableCaching: false }
97
+ * }
98
+ * }
99
+ * );
100
+ * ```
101
+ *
102
+ * @example
103
+ * Optimal setup for customer support chatbot
104
+ * ```typescript
105
+ * const supportAgent = createAgent({
106
+ * model: "anthropic:claude-3-5-sonnet",
107
+ * systemMessage: `You are a customer support agent for ACME Corp.
108
+ *
109
+ * Company policies:
110
+ * - Always be polite and professional
111
+ * - Refer to knowledge base for product information
112
+ * - Escalate billing issues to human agents
113
+ * ... (extensive policies and guidelines)
114
+ * `,
115
+ * tools: [searchKnowledgeBase, createTicket, checkOrderStatus],
116
+ * middleware: [
117
+ * anthropicPromptCachingMiddleware({
118
+ * ttl: "1h", // Long TTL for stable system prompt
119
+ * minMessagesToCache: 1 // Cache immediately due to large system prompt
120
+ * })
121
+ * ]
122
+ * });
123
+ * ```
124
+ *
125
+ * @remarks
126
+ * - **Anthropic Only**: This middleware only works with Anthropic models and will throw an error if used with other providers
127
+ * - **Automatic Application**: Caching is applied automatically when message count exceeds `minMessagesToCache`
128
+ * - **Cache Scope**: Caches are isolated per API key and cannot be shared across different keys
129
+ * - **TTL Options**: Only supports "5m" (5 minutes) and "1h" (1 hour) as TTL values per Anthropic's API
130
+ * - **Best Use Cases**: Long system prompts, multi-turn conversations, repetitive queries, RAG applications
131
+ * - **Cost Impact**: Cached tokens are billed at 10% of the base input token price, cache writes are billed at 25% of the base
132
+ *
133
+ * @see {@link createAgent} for agent creation
134
+ * @see {@link https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching} Anthropic's prompt caching documentation
135
+ * @public
136
+ */
137
+ function anthropicPromptCachingMiddleware(middlewareOptions) {
138
+ return require_middleware.createMiddleware({
139
+ name: "PromptCachingMiddleware",
140
+ contextSchema,
141
+ prepareModelRequest: (options, state, runtime) => {
142
+ /**
143
+ * If the runtime values match the schema default values, use the middleware option
144
+ * values otherwise use the runtime values. This allows to apply general configurations
145
+ * for all invocations, and override them for specific invocations.
146
+ */
147
+ const enableCaching = runtime.context.enableCaching === DEFAULT_ENABLE_CACHING ? middlewareOptions?.enableCaching ?? runtime.context.enableCaching : runtime.context.enableCaching ?? middlewareOptions?.enableCaching;
148
+ const ttl = runtime.context.ttl === DEFAULT_TTL ? middlewareOptions?.ttl ?? runtime.context.ttl : runtime.context.ttl ?? middlewareOptions?.ttl;
149
+ const minMessagesToCache = runtime.context.minMessagesToCache === DEFAULT_MIN_MESSAGES_TO_CACHE ? middlewareOptions?.minMessagesToCache ?? runtime.context.minMessagesToCache : runtime.context.minMessagesToCache ?? middlewareOptions?.minMessagesToCache;
150
+ if (!enableCaching) return void 0;
151
+ if (options.model?.getName() !== "ChatAnthropic") throw new Error("Prompt caching is only supported for Anthropic models");
152
+ const messagesCount = state.messages.length + (options.systemMessage ? 1 : 0);
153
+ if (messagesCount < minMessagesToCache) return options;
154
+ /**
155
+ * Add cache_control to the last message
156
+ */
157
+ const lastMessage = options.messages.at(-1);
158
+ if (!lastMessage) return options;
159
+ if (Array.isArray(lastMessage.content)) lastMessage.content = [...lastMessage.content.slice(0, -1), {
160
+ ...lastMessage.content.at(-1),
161
+ cache_control: {
162
+ type: "ephemeral",
163
+ ttl
164
+ }
165
+ }];
166
+ else if (typeof lastMessage.content === "string") lastMessage.content = [{
167
+ type: "text",
168
+ text: lastMessage.content,
169
+ cache_control: {
170
+ type: "ephemeral",
171
+ ttl
172
+ }
173
+ }];
174
+ else throw new PromptCachingMiddlewareError("Last message content is not a string or array");
175
+ return options;
176
+ }
177
+ });
178
+ }
179
+
180
+ //#endregion
181
+ exports.anthropicPromptCachingMiddleware = anthropicPromptCachingMiddleware;
182
+ //# sourceMappingURL=promptCaching.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptCaching.cjs","names":["z","message: string","middlewareOptions?: Partial<z.infer<typeof contextSchema>>","createMiddleware"],"sources":["../../../../src/agents/middlewareAgent/middleware/promptCaching.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport { ContentBlock } from \"@langchain/core/messages\";\nimport { createMiddleware } from \"../middleware.js\";\n\nconst DEFAULT_ENABLE_CACHING = true;\nconst DEFAULT_TTL = \"5m\";\nconst DEFAULT_MIN_MESSAGES_TO_CACHE = 3;\n\nconst contextSchema = z.object({\n // Configuration options\n enableCaching: z.boolean().default(DEFAULT_ENABLE_CACHING),\n ttl: z.enum([\"5m\", \"1h\"]).default(DEFAULT_TTL),\n minMessagesToCache: z.number().default(DEFAULT_MIN_MESSAGES_TO_CACHE),\n});\n\nclass PromptCachingMiddlewareError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PromptCachingMiddlewareError\";\n }\n}\n\n/**\n * Creates a prompt caching middleware for Anthropic models to optimize API usage.\n *\n * This middleware automatically adds cache control headers to the last messages when using Anthropic models,\n * enabling their prompt caching feature. This can significantly reduce costs for applications with repetitive\n * prompts, long system messages, or extensive conversation histories.\n *\n * ## How It Works\n *\n * The middleware intercepts model requests and adds cache control metadata that tells Anthropic's\n * API to cache processed prompt prefixes. On subsequent requests with matching prefixes, the\n * cached representations are reused, skipping redundant token processing.\n *\n * ## Benefits\n *\n * - **Cost Reduction**: Avoid reprocessing the same tokens repeatedly (up to 90% savings on cached portions)\n * - **Lower Latency**: Cached prompts are processed faster as embeddings are pre-computed\n * - **Better Scalability**: Reduced computational load enables handling more requests\n * - **Consistent Performance**: Stable response times for repetitive queries\n *\n * @param middlewareOptions - Configuration options for the caching behavior\n * @param middlewareOptions.enableCaching - Whether to enable prompt caching (default: `true`)\n * @param middlewareOptions.ttl - Cache time-to-live: `\"5m\"` for 5 minutes or `\"1h\"` for 1 hour (default: `\"5m\"`)\n * @param middlewareOptions.minMessagesToCache - Minimum number of messages required before caching is applied (default: `3`)\n *\n * @returns A middleware instance that can be passed to `createAgent`\n *\n * @throws {Error} If used with non-Anthropic models\n *\n * @example\n * Basic usage with default settings\n * ```typescript\n * import { createAgent } from \"langchain\";\n * import { anthropicPromptCachingMiddleware } from \"langchain/middleware\";\n *\n * const agent = createAgent({\n * model: \"anthropic:claude-3-5-sonnet\",\n * middleware: [\n * anthropicPromptCachingMiddleware()\n * ]\n * });\n * ```\n *\n * @example\n * Custom configuration for longer conversations\n * ```typescript\n * const cachingMiddleware = anthropicPromptCachingMiddleware({\n * ttl: \"1h\", // Cache for 1 hour instead of default 5 minutes\n * minMessagesToCache: 5 // Only cache after 5 messages\n * });\n *\n * const agent = createAgent({\n * model: \"anthropic:claude-3-5-sonnet\",\n * systemMessage: \"You are a helpful assistant with deep knowledge of...\", // Long system prompt\n * middleware: [cachingMiddleware]\n * });\n * ```\n *\n * @example\n * Conditional caching based on runtime context\n * ```typescript\n * const agent = createAgent({\n * model: \"anthropic:claude-3-5-sonnet\",\n * middleware: [\n * anthropicPromptCachingMiddleware({\n * enableCaching: true,\n * ttl: \"5m\"\n * })\n * ]\n * });\n *\n * // Disable caching for specific requests\n * await agent.invoke(\n * { messages: [new HumanMessage(\"Process this without caching\")] },\n * {\n * configurable: {\n * middleware_context: { enableCaching: false }\n * }\n * }\n * );\n * ```\n *\n * @example\n * Optimal setup for customer support chatbot\n * ```typescript\n * const supportAgent = createAgent({\n * model: \"anthropic:claude-3-5-sonnet\",\n * systemMessage: `You are a customer support agent for ACME Corp.\n *\n * Company policies:\n * - Always be polite and professional\n * - Refer to knowledge base for product information\n * - Escalate billing issues to human agents\n * ... (extensive policies and guidelines)\n * `,\n * tools: [searchKnowledgeBase, createTicket, checkOrderStatus],\n * middleware: [\n * anthropicPromptCachingMiddleware({\n * ttl: \"1h\", // Long TTL for stable system prompt\n * minMessagesToCache: 1 // Cache immediately due to large system prompt\n * })\n * ]\n * });\n * ```\n *\n * @remarks\n * - **Anthropic Only**: This middleware only works with Anthropic models and will throw an error if used with other providers\n * - **Automatic Application**: Caching is applied automatically when message count exceeds `minMessagesToCache`\n * - **Cache Scope**: Caches are isolated per API key and cannot be shared across different keys\n * - **TTL Options**: Only supports \"5m\" (5 minutes) and \"1h\" (1 hour) as TTL values per Anthropic's API\n * - **Best Use Cases**: Long system prompts, multi-turn conversations, repetitive queries, RAG applications\n * - **Cost Impact**: Cached tokens are billed at 10% of the base input token price, cache writes are billed at 25% of the base\n *\n * @see {@link createAgent} for agent creation\n * @see {@link https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching} Anthropic's prompt caching documentation\n * @public\n */\nexport function anthropicPromptCachingMiddleware(\n middlewareOptions?: Partial<z.infer<typeof contextSchema>>\n) {\n return createMiddleware({\n name: \"PromptCachingMiddleware\",\n contextSchema,\n prepareModelRequest: (options, state, runtime) => {\n /**\n * If the runtime values match the schema default values, use the middleware option\n * values otherwise use the runtime values. This allows to apply general configurations\n * for all invocations, and override them for specific invocations.\n */\n const enableCaching =\n runtime.context.enableCaching === DEFAULT_ENABLE_CACHING\n ? middlewareOptions?.enableCaching ?? runtime.context.enableCaching\n : runtime.context.enableCaching ?? middlewareOptions?.enableCaching;\n const ttl =\n runtime.context.ttl === DEFAULT_TTL\n ? middlewareOptions?.ttl ?? runtime.context.ttl\n : runtime.context.ttl ?? middlewareOptions?.ttl;\n const minMessagesToCache =\n runtime.context.minMessagesToCache === DEFAULT_MIN_MESSAGES_TO_CACHE\n ? middlewareOptions?.minMessagesToCache ??\n runtime.context.minMessagesToCache\n : runtime.context.minMessagesToCache ??\n middlewareOptions?.minMessagesToCache;\n\n // Skip if caching is disabled\n if (!enableCaching) {\n return undefined;\n }\n\n if (options.model?.getName() !== \"ChatAnthropic\") {\n throw new Error(\n \"Prompt caching is only supported for Anthropic models\"\n );\n }\n\n const messagesCount =\n state.messages.length + (options.systemMessage ? 1 : 0);\n\n if (messagesCount < minMessagesToCache) {\n return options;\n }\n\n /**\n * Add cache_control to the last message\n */\n const lastMessage = options.messages.at(-1);\n if (!lastMessage) {\n return options;\n }\n\n if (Array.isArray(lastMessage.content)) {\n lastMessage.content = [\n ...lastMessage.content.slice(0, -1),\n {\n ...lastMessage.content.at(-1),\n cache_control: {\n type: \"ephemeral\",\n ttl,\n },\n } as ContentBlock,\n ];\n } else if (typeof lastMessage.content === \"string\") {\n lastMessage.content = [\n {\n type: \"text\",\n text: lastMessage.content,\n cache_control: {\n type: \"ephemeral\",\n ttl,\n },\n },\n ];\n } else {\n throw new PromptCachingMiddlewareError(\n \"Last message content is not a string or array\"\n );\n }\n\n return options;\n },\n });\n}\n"],"mappings":";;;;;AAIA,MAAM,yBAAyB;AAC/B,MAAM,cAAc;AACpB,MAAM,gCAAgC;AAEtC,MAAM,gBAAgBA,SAAE,OAAO;CAE7B,eAAeA,SAAE,SAAS,CAAC,QAAQ,uBAAuB;CAC1D,KAAKA,SAAE,KAAK,CAAC,MAAM,IAAK,EAAC,CAAC,QAAQ,YAAY;CAC9C,oBAAoBA,SAAE,QAAQ,CAAC,QAAQ,8BAA8B;AACtE,EAAC;AAEF,IAAM,+BAAN,cAA2C,MAAM;CAC/C,YAAYC,SAAiB;EAC3B,MAAM,QAAQ;EACd,KAAK,OAAO;CACb;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuHD,SAAgB,iCACdC,mBACA;AACA,QAAOC,oCAAiB;EACtB,MAAM;EACN;EACA,qBAAqB,CAAC,SAAS,OAAO,YAAY;;;;;;GAMhD,MAAM,gBACJ,QAAQ,QAAQ,kBAAkB,yBAC9B,mBAAmB,iBAAiB,QAAQ,QAAQ,gBACpD,QAAQ,QAAQ,iBAAiB,mBAAmB;GAC1D,MAAM,MACJ,QAAQ,QAAQ,QAAQ,cACpB,mBAAmB,OAAO,QAAQ,QAAQ,MAC1C,QAAQ,QAAQ,OAAO,mBAAmB;GAChD,MAAM,qBACJ,QAAQ,QAAQ,uBAAuB,gCACnC,mBAAmB,sBACnB,QAAQ,QAAQ,qBAChB,QAAQ,QAAQ,sBAChB,mBAAmB;AAGzB,OAAI,CAAC,cACH,QAAO;AAGT,OAAI,QAAQ,OAAO,SAAS,KAAK,gBAC/B,OAAM,IAAI,MACR;GAIJ,MAAM,gBACJ,MAAM,SAAS,UAAU,QAAQ,gBAAgB,IAAI;AAEvD,OAAI,gBAAgB,mBAClB,QAAO;;;;GAMT,MAAM,cAAc,QAAQ,SAAS,GAAG,GAAG;AAC3C,OAAI,CAAC,YACH,QAAO;AAGT,OAAI,MAAM,QAAQ,YAAY,QAAQ,EACpC,YAAY,UAAU,CACpB,GAAG,YAAY,QAAQ,MAAM,GAAG,GAAG,EACnC;IACE,GAAG,YAAY,QAAQ,GAAG,GAAG;IAC7B,eAAe;KACb,MAAM;KACN;IACD;GACF,CACF;YACQ,OAAO,YAAY,YAAY,UACxC,YAAY,UAAU,CACpB;IACE,MAAM;IACN,MAAM,YAAY;IAClB,eAAe;KACb,MAAM;KACN;IACD;GACF,CACF;OAED,OAAM,IAAI,6BACR;AAIJ,UAAO;EACR;CACF,EAAC;AACH"}