beeai-framework 0.1.21 → 0.1.23

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 (335) hide show
  1. package/dist/adapters/a2a/agents/agent.d.cts +6 -10
  2. package/dist/adapters/a2a/agents/agent.d.ts +6 -10
  3. package/dist/adapters/a2a/agents/events.d.cts +1 -1
  4. package/dist/adapters/a2a/agents/events.d.ts +1 -1
  5. package/dist/adapters/a2a/agents/types.d.cts +2 -2
  6. package/dist/adapters/a2a/agents/types.d.ts +2 -2
  7. package/dist/adapters/a2a/serve/agent_executor.d.cts +3 -3
  8. package/dist/adapters/a2a/serve/agent_executor.d.ts +3 -3
  9. package/dist/adapters/a2a/serve/server.d.cts +2 -2
  10. package/dist/adapters/a2a/serve/server.d.ts +2 -2
  11. package/dist/adapters/acp/agents/agent.d.cts +6 -10
  12. package/dist/adapters/acp/agents/agent.d.ts +6 -10
  13. package/dist/adapters/acp/agents/events.d.cts +1 -1
  14. package/dist/adapters/acp/agents/events.d.ts +1 -1
  15. package/dist/adapters/agentstack/agents/agent.d.cts +8 -6
  16. package/dist/adapters/agentstack/agents/agent.d.ts +8 -6
  17. package/dist/adapters/agentstack/agents/events.d.cts +1 -1
  18. package/dist/adapters/agentstack/agents/events.d.ts +1 -1
  19. package/dist/adapters/amazon-bedrock/backend/chat.d.cts +2 -2
  20. package/dist/adapters/amazon-bedrock/backend/chat.d.ts +2 -2
  21. package/dist/adapters/amazon-bedrock/backend/embedding.d.cts +2 -2
  22. package/dist/adapters/amazon-bedrock/backend/embedding.d.ts +2 -2
  23. package/dist/adapters/anthropic/backend/chat.d.cts +2 -2
  24. package/dist/adapters/anthropic/backend/chat.d.ts +2 -2
  25. package/dist/adapters/anthropic/backend/embedding.d.cts +2 -2
  26. package/dist/adapters/anthropic/backend/embedding.d.ts +2 -2
  27. package/dist/adapters/azure-openai/backend/chat.d.cts +2 -2
  28. package/dist/adapters/azure-openai/backend/chat.d.ts +2 -2
  29. package/dist/adapters/azure-openai/backend/embedding.d.cts +2 -2
  30. package/dist/adapters/azure-openai/backend/embedding.d.ts +2 -2
  31. package/dist/adapters/dummy/backend/chat.d.cts +2 -2
  32. package/dist/adapters/dummy/backend/chat.d.ts +2 -2
  33. package/dist/adapters/dummy/backend/embedding.d.cts +2 -2
  34. package/dist/adapters/dummy/backend/embedding.d.ts +2 -2
  35. package/dist/adapters/google-vertex/backend/chat.d.cts +2 -2
  36. package/dist/adapters/google-vertex/backend/chat.d.ts +2 -2
  37. package/dist/adapters/google-vertex/backend/embedding.d.cts +2 -2
  38. package/dist/adapters/google-vertex/backend/embedding.d.ts +2 -2
  39. package/dist/adapters/groq/backend/chat.d.cts +2 -2
  40. package/dist/adapters/groq/backend/chat.d.ts +2 -2
  41. package/dist/adapters/groq/backend/embedding.d.cts +2 -2
  42. package/dist/adapters/groq/backend/embedding.d.ts +2 -2
  43. package/dist/adapters/langchain/backend/chat.d.cts +2 -2
  44. package/dist/adapters/langchain/backend/chat.d.ts +2 -2
  45. package/dist/adapters/langchain/backend/embedding.d.cts +2 -2
  46. package/dist/adapters/langchain/backend/embedding.d.ts +2 -2
  47. package/dist/adapters/langchain/tools.d.cts +1 -1
  48. package/dist/adapters/langchain/tools.d.ts +1 -1
  49. package/dist/adapters/ollama/backend/chat.cjs +1 -2
  50. package/dist/adapters/ollama/backend/chat.cjs.map +1 -1
  51. package/dist/adapters/ollama/backend/chat.d.cts +2 -3
  52. package/dist/adapters/ollama/backend/chat.d.ts +2 -3
  53. package/dist/adapters/ollama/backend/chat.js +1 -2
  54. package/dist/adapters/ollama/backend/chat.js.map +1 -1
  55. package/dist/adapters/ollama/backend/embedding.d.cts +2 -2
  56. package/dist/adapters/ollama/backend/embedding.d.ts +2 -2
  57. package/dist/adapters/openai/backend/chat.d.cts +2 -2
  58. package/dist/adapters/openai/backend/chat.d.ts +2 -2
  59. package/dist/adapters/openai/backend/embedding.d.cts +2 -2
  60. package/dist/adapters/openai/backend/embedding.d.ts +2 -2
  61. package/dist/adapters/vercel/backend/chat.cjs +77 -17
  62. package/dist/adapters/vercel/backend/chat.cjs.map +1 -1
  63. package/dist/adapters/vercel/backend/chat.d.cts +2 -2
  64. package/dist/adapters/vercel/backend/chat.d.ts +2 -2
  65. package/dist/adapters/vercel/backend/chat.js +77 -17
  66. package/dist/adapters/vercel/backend/chat.js.map +1 -1
  67. package/dist/adapters/vercel/backend/embedding.d.cts +2 -2
  68. package/dist/adapters/vercel/backend/embedding.d.ts +2 -2
  69. package/dist/adapters/vercel/backend/utils.cjs +32 -0
  70. package/dist/adapters/vercel/backend/utils.cjs.map +1 -1
  71. package/dist/adapters/vercel/backend/utils.d.cts +6 -4
  72. package/dist/adapters/vercel/backend/utils.d.ts +6 -4
  73. package/dist/adapters/vercel/backend/utils.js +31 -1
  74. package/dist/adapters/vercel/backend/utils.js.map +1 -1
  75. package/dist/adapters/watsonx/backend/chat.cjs +7 -8
  76. package/dist/adapters/watsonx/backend/chat.cjs.map +1 -1
  77. package/dist/adapters/watsonx/backend/chat.d.cts +4 -4
  78. package/dist/adapters/watsonx/backend/chat.d.ts +4 -4
  79. package/dist/adapters/watsonx/backend/chat.js +7 -8
  80. package/dist/adapters/watsonx/backend/chat.js.map +1 -1
  81. package/dist/adapters/watsonx/backend/embedding.d.cts +2 -2
  82. package/dist/adapters/watsonx/backend/embedding.d.ts +2 -2
  83. package/dist/adapters/xai/backend/chat.d.cts +2 -2
  84. package/dist/adapters/xai/backend/chat.d.ts +2 -2
  85. package/dist/{agent-DvvVGvLr.d.cts → agent-BVuc9Nfn.d.cts} +5 -4
  86. package/dist/{agent-CHebzsQB.d.ts → agent-Cuy8Q4gw.d.ts} +5 -4
  87. package/dist/agents/base.cjs +5 -2
  88. package/dist/agents/base.cjs.map +1 -1
  89. package/dist/agents/base.d.cts +2 -2
  90. package/dist/agents/base.d.ts +2 -2
  91. package/dist/agents/base.js +5 -2
  92. package/dist/agents/base.js.map +1 -1
  93. package/dist/agents/experimental/replan/agent.d.cts +3 -3
  94. package/dist/agents/experimental/replan/agent.d.ts +3 -3
  95. package/dist/agents/experimental/replan/prompts.d.cts +1 -1
  96. package/dist/agents/experimental/replan/prompts.d.ts +1 -1
  97. package/dist/agents/experimental/streamlit/agent.d.cts +8 -12
  98. package/dist/agents/experimental/streamlit/agent.d.ts +8 -12
  99. package/dist/agents/react/agent.d.cts +4 -4
  100. package/dist/agents/react/agent.d.ts +4 -4
  101. package/dist/agents/react/runners/base.d.cts +4 -4
  102. package/dist/agents/react/runners/base.d.ts +4 -4
  103. package/dist/agents/react/runners/deep-think/runner.d.cts +4 -4
  104. package/dist/agents/react/runners/deep-think/runner.d.ts +4 -4
  105. package/dist/agents/react/runners/default/runner.d.cts +5 -5
  106. package/dist/agents/react/runners/default/runner.d.ts +5 -5
  107. package/dist/agents/react/runners/granite/runner.d.cts +4 -4
  108. package/dist/agents/react/runners/granite/runner.d.ts +4 -4
  109. package/dist/agents/react/types.d.cts +2 -2
  110. package/dist/agents/react/types.d.ts +2 -2
  111. package/dist/agents/requirement/agent.cjs +162 -0
  112. package/dist/agents/requirement/agent.cjs.map +1 -0
  113. package/dist/agents/requirement/agent.d.cts +29 -0
  114. package/dist/agents/requirement/agent.d.ts +29 -0
  115. package/dist/agents/requirement/agent.js +160 -0
  116. package/dist/agents/requirement/agent.js.map +1 -0
  117. package/dist/agents/requirement/prompts.cjs +95 -0
  118. package/dist/agents/requirement/prompts.cjs.map +1 -0
  119. package/dist/agents/requirement/prompts.d.cts +107 -0
  120. package/dist/agents/requirement/prompts.d.ts +107 -0
  121. package/dist/agents/requirement/prompts.js +90 -0
  122. package/dist/agents/requirement/prompts.js.map +1 -0
  123. package/dist/agents/requirement/requirements/conditional.cjs +190 -0
  124. package/dist/agents/requirement/requirements/conditional.cjs.map +1 -0
  125. package/dist/agents/requirement/requirements/conditional.d.cts +71 -0
  126. package/dist/agents/requirement/requirements/conditional.d.ts +71 -0
  127. package/dist/agents/requirement/requirements/conditional.js +188 -0
  128. package/dist/agents/requirement/requirements/conditional.js.map +1 -0
  129. package/dist/agents/requirement/requirements/requirement.cjs +107 -0
  130. package/dist/agents/requirement/requirements/requirement.cjs.map +1 -0
  131. package/dist/agents/requirement/requirements/requirement.d.cts +59 -0
  132. package/dist/agents/requirement/requirements/requirement.d.ts +59 -0
  133. package/dist/agents/requirement/requirements/requirement.js +104 -0
  134. package/dist/agents/requirement/requirements/requirement.js.map +1 -0
  135. package/dist/agents/requirement/requirements/utils.cjs +74 -0
  136. package/dist/agents/requirement/requirements/utils.cjs.map +1 -0
  137. package/dist/agents/requirement/requirements/utils.d.cts +40 -0
  138. package/dist/agents/requirement/requirements/utils.d.ts +40 -0
  139. package/dist/agents/requirement/requirements/utils.js +69 -0
  140. package/dist/agents/requirement/requirements/utils.js.map +1 -0
  141. package/dist/agents/requirement/runner.cjs +268 -0
  142. package/dist/agents/requirement/runner.cjs.map +1 -0
  143. package/dist/agents/requirement/runner.d.cts +115 -0
  144. package/dist/agents/requirement/runner.d.ts +115 -0
  145. package/dist/agents/requirement/runner.js +266 -0
  146. package/dist/agents/requirement/runner.js.map +1 -0
  147. package/dist/agents/requirement/types.cjs +40 -0
  148. package/dist/agents/requirement/types.cjs.map +1 -0
  149. package/dist/agents/requirement/types.d.cts +24 -0
  150. package/dist/agents/requirement/types.d.ts +24 -0
  151. package/dist/agents/requirement/types.js +35 -0
  152. package/dist/agents/requirement/types.js.map +1 -0
  153. package/dist/agents/requirement/utils/llm.cjs +202 -0
  154. package/dist/agents/requirement/utils/llm.cjs.map +1 -0
  155. package/dist/agents/requirement/utils/llm.d.cts +50 -0
  156. package/dist/agents/requirement/utils/llm.d.ts +50 -0
  157. package/dist/agents/requirement/utils/llm.js +199 -0
  158. package/dist/agents/requirement/utils/llm.js.map +1 -0
  159. package/dist/agents/requirement/utils/tool.cjs +95 -0
  160. package/dist/agents/requirement/utils/tool.cjs.map +1 -0
  161. package/dist/agents/requirement/utils/tool.d.cts +24 -0
  162. package/dist/agents/requirement/utils/tool.d.ts +24 -0
  163. package/dist/agents/requirement/utils/tool.js +92 -0
  164. package/dist/agents/requirement/utils/tool.js.map +1 -0
  165. package/dist/agents/requirement/utils/toolCallChecker.cjs +61 -0
  166. package/dist/agents/requirement/utils/toolCallChecker.cjs.map +1 -0
  167. package/dist/agents/requirement/utils/toolCallChecker.d.cts +28 -0
  168. package/dist/agents/requirement/utils/toolCallChecker.d.ts +28 -0
  169. package/dist/agents/requirement/utils/toolCallChecker.js +59 -0
  170. package/dist/agents/requirement/utils/toolCallChecker.js.map +1 -0
  171. package/dist/agents/toolCalling/agent.cjs +4 -1
  172. package/dist/agents/toolCalling/agent.cjs.map +1 -1
  173. package/dist/agents/toolCalling/agent.d.cts +11 -12
  174. package/dist/agents/toolCalling/agent.d.ts +11 -12
  175. package/dist/agents/toolCalling/agent.js +5 -2
  176. package/dist/agents/toolCalling/agent.js.map +1 -1
  177. package/dist/agents/toolCalling/types.d.cts +1 -1
  178. package/dist/agents/toolCalling/types.d.ts +1 -1
  179. package/dist/agents/types.d.cts +2 -2
  180. package/dist/agents/types.d.ts +2 -2
  181. package/dist/backend/backend.d.cts +2 -2
  182. package/dist/backend/backend.d.ts +2 -2
  183. package/dist/backend/chat.cjs +122 -4
  184. package/dist/backend/chat.cjs.map +1 -1
  185. package/dist/backend/chat.d.cts +3 -3
  186. package/dist/backend/chat.d.ts +3 -3
  187. package/dist/backend/chat.js +123 -5
  188. package/dist/backend/chat.js.map +1 -1
  189. package/dist/backend/core.d.cts +3 -3
  190. package/dist/backend/core.d.ts +3 -3
  191. package/dist/backend/embedding.d.cts +2 -2
  192. package/dist/backend/embedding.d.ts +2 -2
  193. package/dist/backend/message.cjs +20 -13
  194. package/dist/backend/message.cjs.map +1 -1
  195. package/dist/backend/message.d.cts +7 -3
  196. package/dist/backend/message.d.ts +7 -3
  197. package/dist/backend/message.js +20 -13
  198. package/dist/backend/message.js.map +1 -1
  199. package/dist/backend/utils.d.cts +2 -2
  200. package/dist/backend/utils.d.ts +2 -2
  201. package/dist/{base-BQgDlcGa.d.ts → base-CyFx7BRL.d.ts} +5 -3
  202. package/dist/{base-CwcxwybB.d.cts → base-XfWeXQ-S.d.cts} +5 -3
  203. package/dist/{chat-CRb3vUVg.d.cts → chat-BOb9n7AJ.d.cts} +7 -8
  204. package/dist/{chat-C0s-o6ll.d.ts → chat-DrqwUgD8.d.ts} +7 -8
  205. package/dist/context.cjs +22 -5
  206. package/dist/context.cjs.map +1 -1
  207. package/dist/context.d.cts +19 -6
  208. package/dist/context.d.ts +19 -6
  209. package/dist/context.js +23 -7
  210. package/dist/context.js.map +1 -1
  211. package/dist/emitter/emitter.cjs +21 -14
  212. package/dist/emitter/emitter.cjs.map +1 -1
  213. package/dist/emitter/emitter.d.cts +1 -1
  214. package/dist/emitter/emitter.d.ts +1 -1
  215. package/dist/emitter/emitter.js +21 -14
  216. package/dist/emitter/emitter.js.map +1 -1
  217. package/dist/emitter/types.d.cts +1 -1
  218. package/dist/emitter/types.d.ts +1 -1
  219. package/dist/{emitter-CZFbzlUi.d.ts → emitter-36-9MnvA.d.ts} +4 -3
  220. package/dist/{emitter-DpqUYjXH.d.cts → emitter-jN55XZZq.d.cts} +4 -3
  221. package/dist/index.d.cts +5 -5
  222. package/dist/index.d.ts +5 -5
  223. package/dist/internals/fetcher.d.cts +1 -1
  224. package/dist/internals/fetcher.d.ts +1 -1
  225. package/dist/internals/helpers/prototype.cjs +5 -0
  226. package/dist/internals/helpers/prototype.cjs.map +1 -1
  227. package/dist/internals/helpers/prototype.d.cts +2 -1
  228. package/dist/internals/helpers/prototype.d.ts +2 -1
  229. package/dist/internals/helpers/prototype.js +5 -1
  230. package/dist/internals/helpers/prototype.js.map +1 -1
  231. package/dist/internals/types.cjs.map +1 -1
  232. package/dist/internals/types.d.cts +1 -1
  233. package/dist/internals/types.d.ts +1 -1
  234. package/dist/internals/types.js.map +1 -1
  235. package/dist/memory/summarizeMemory.d.cts +2 -2
  236. package/dist/memory/summarizeMemory.d.ts +2 -2
  237. package/dist/middleware/streamToolCall.cjs +132 -0
  238. package/dist/middleware/streamToolCall.cjs.map +1 -0
  239. package/dist/middleware/streamToolCall.d.cts +94 -0
  240. package/dist/middleware/streamToolCall.d.ts +94 -0
  241. package/dist/middleware/streamToolCall.js +130 -0
  242. package/dist/middleware/streamToolCall.js.map +1 -0
  243. package/dist/middleware/trajectory.cjs +331 -0
  244. package/dist/middleware/trajectory.cjs.map +1 -0
  245. package/dist/middleware/trajectory.d.cts +115 -0
  246. package/dist/middleware/trajectory.d.ts +115 -0
  247. package/dist/middleware/trajectory.js +329 -0
  248. package/dist/middleware/trajectory.js.map +1 -0
  249. package/dist/parsers/linePrefix.d.cts +1 -1
  250. package/dist/parsers/linePrefix.d.ts +1 -1
  251. package/dist/serializer/serializer.cjs +5 -4
  252. package/dist/serializer/serializer.cjs.map +1 -1
  253. package/dist/serializer/serializer.d.cts +1 -1
  254. package/dist/serializer/serializer.d.ts +1 -1
  255. package/dist/serializer/serializer.js +5 -4
  256. package/dist/serializer/serializer.js.map +1 -1
  257. package/dist/serializer/utils.cjs +3 -0
  258. package/dist/serializer/utils.cjs.map +1 -1
  259. package/dist/serializer/utils.d.cts +1 -1
  260. package/dist/serializer/utils.d.ts +1 -1
  261. package/dist/serializer/utils.js +3 -0
  262. package/dist/serializer/utils.js.map +1 -1
  263. package/dist/{serializer-CQxucveV.d.ts → serializer-53t8gGQa.d.ts} +3 -2
  264. package/dist/{serializer-BKn50Vnx.d.cts → serializer-c51B2z6d.d.cts} +3 -2
  265. package/dist/template.cjs +20 -0
  266. package/dist/template.cjs.map +1 -1
  267. package/dist/template.d.cts +1 -0
  268. package/dist/template.d.ts +1 -0
  269. package/dist/template.js +20 -0
  270. package/dist/template.js.map +1 -1
  271. package/dist/tools/arxiv.d.cts +1 -1
  272. package/dist/tools/arxiv.d.ts +1 -1
  273. package/dist/tools/base.cjs.map +1 -1
  274. package/dist/tools/base.d.cts +3 -2
  275. package/dist/tools/base.d.ts +3 -2
  276. package/dist/tools/base.js.map +1 -1
  277. package/dist/tools/calculator.d.cts +1 -1
  278. package/dist/tools/calculator.d.ts +1 -1
  279. package/dist/tools/custom.d.cts +2 -2
  280. package/dist/tools/custom.d.ts +2 -2
  281. package/dist/tools/database/elasticsearch.d.cts +1 -1
  282. package/dist/tools/database/elasticsearch.d.ts +1 -1
  283. package/dist/tools/database/milvus.d.cts +3 -3
  284. package/dist/tools/database/milvus.d.ts +3 -3
  285. package/dist/tools/database/qdrant.d.cts +1 -1
  286. package/dist/tools/database/qdrant.d.ts +1 -1
  287. package/dist/tools/database/sql.d.cts +1 -1
  288. package/dist/tools/database/sql.d.ts +1 -1
  289. package/dist/tools/handoff.cjs +68 -0
  290. package/dist/tools/handoff.cjs.map +1 -0
  291. package/dist/tools/handoff.d.cts +47 -0
  292. package/dist/tools/handoff.d.ts +47 -0
  293. package/dist/tools/handoff.js +66 -0
  294. package/dist/tools/handoff.js.map +1 -0
  295. package/dist/tools/llm.d.cts +2 -2
  296. package/dist/tools/llm.d.ts +2 -2
  297. package/dist/tools/mcp.d.cts +1 -1
  298. package/dist/tools/mcp.d.ts +1 -1
  299. package/dist/tools/openapi.d.cts +1 -1
  300. package/dist/tools/openapi.d.ts +1 -1
  301. package/dist/tools/python/output.d.cts +1 -1
  302. package/dist/tools/python/output.d.ts +1 -1
  303. package/dist/tools/python/python.d.cts +2 -2
  304. package/dist/tools/python/python.d.ts +2 -2
  305. package/dist/tools/search/base.d.cts +1 -1
  306. package/dist/tools/search/base.d.ts +1 -1
  307. package/dist/tools/search/duckDuckGoSearch.d.cts +1 -1
  308. package/dist/tools/search/duckDuckGoSearch.d.ts +1 -1
  309. package/dist/tools/search/googleSearch.d.cts +1 -1
  310. package/dist/tools/search/googleSearch.d.ts +1 -1
  311. package/dist/tools/search/searXNGSearch.d.cts +1 -1
  312. package/dist/tools/search/searXNGSearch.d.ts +1 -1
  313. package/dist/tools/search/wikipedia.d.cts +1 -1
  314. package/dist/tools/search/wikipedia.d.ts +1 -1
  315. package/dist/tools/similarity.d.cts +1 -1
  316. package/dist/tools/similarity.d.ts +1 -1
  317. package/dist/tools/think.cjs +52 -0
  318. package/dist/tools/think.cjs.map +1 -0
  319. package/dist/tools/think.d.cts +47 -0
  320. package/dist/tools/think.d.ts +47 -0
  321. package/dist/tools/think.js +50 -0
  322. package/dist/tools/think.js.map +1 -0
  323. package/dist/tools/weather/openMeteo.d.cts +1 -1
  324. package/dist/tools/weather/openMeteo.d.ts +1 -1
  325. package/dist/tools/web/webCrawler.d.cts +1 -1
  326. package/dist/tools/web/webCrawler.d.ts +1 -1
  327. package/dist/types-CJwiMH3u.d.ts +213 -0
  328. package/dist/types-W0QttuP_.d.cts +213 -0
  329. package/dist/version.cjs +1 -1
  330. package/dist/version.js +1 -1
  331. package/dist/workflows/agent.d.cts +3 -3
  332. package/dist/workflows/agent.d.ts +3 -3
  333. package/dist/workflows/workflow.d.cts +1 -1
  334. package/dist/workflows/workflow.d.ts +1 -1
  335. package/package.json +11 -11
@@ -0,0 +1,132 @@
1
+ 'use strict';
2
+
3
+ var context_cjs = require('../context.cjs');
4
+ var emitter_cjs = require('../emitter/emitter.cjs');
5
+ var chat_cjs = require('../backend/chat.cjs');
6
+ var schema_cjs = require('../internals/helpers/schema.cjs');
7
+ var remeda = require('remeda');
8
+ var object_cjs = require('../internals/helpers/object.cjs');
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
12
+ class StreamToolCallMiddleware extends context_cjs.Middleware {
13
+ static {
14
+ __name(this, "StreamToolCallMiddleware");
15
+ }
16
+ target;
17
+ key;
18
+ matchNested;
19
+ forceStreaming;
20
+ cleanups = [];
21
+ output = new chat_cjs.ChatModelOutput([]);
22
+ buffer = "";
23
+ delta = "";
24
+ emitter;
25
+ constructor(options) {
26
+ super();
27
+ this.target = options.target;
28
+ this.key = options.key;
29
+ this.matchNested = options.matchNested ?? false;
30
+ this.forceStreaming = options.forceStreaming ?? false;
31
+ this.emitter = emitter_cjs.Emitter.root.child({
32
+ namespace: [
33
+ "middleware",
34
+ "streamToolCall"
35
+ ]
36
+ });
37
+ }
38
+ bind(ctx) {
39
+ this.output = new chat_cjs.ChatModelOutput([]);
40
+ this.buffer = "";
41
+ this.delta = "";
42
+ this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof chat_cjs.ChatModel && meta.name === "start", this.handleStart.bind(this), this.createEmitterOptions()));
43
+ this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof chat_cjs.ChatModel && meta.name === "newToken", this.handleNewToken.bind(this), this.createEmitterOptions()));
44
+ this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof chat_cjs.ChatModel && meta.name === "success", this.handleSuccess.bind(this), this.createEmitterOptions()));
45
+ }
46
+ unbind() {
47
+ while (this.cleanups.length > 0) {
48
+ const fn = this.cleanups.shift();
49
+ fn();
50
+ }
51
+ }
52
+ createEmitterOptions() {
53
+ return {
54
+ matchNested: this.matchNested,
55
+ isBlocking: true
56
+ };
57
+ }
58
+ async process(toolName, args) {
59
+ if (toolName !== this.target.name) {
60
+ return;
61
+ }
62
+ const parsedArgs = remeda.isString(args) ? schema_cjs.parseBrokenJson(args, {
63
+ pair: [
64
+ "{",
65
+ "}"
66
+ ]
67
+ }) : args;
68
+ const outputStructured = await this.target.parse(parsedArgs).catch(() => null);
69
+ if (!outputStructured) {
70
+ return;
71
+ }
72
+ let output = "";
73
+ if (object_cjs.hasProp(outputStructured, this.key)) {
74
+ output = outputStructured[this.key] || "";
75
+ if (!remeda.isString(output)) {
76
+ output = JSON.stringify(output);
77
+ }
78
+ this.delta = output.slice(this.buffer.length);
79
+ this.buffer = output;
80
+ if (!this.delta) {
81
+ return;
82
+ }
83
+ }
84
+ await this.emitter.emit("update", {
85
+ outputStructured,
86
+ delta: this.delta,
87
+ output
88
+ });
89
+ }
90
+ async handleStart(data, _meta) {
91
+ if (this.forceStreaming) {
92
+ data.input.stream = true;
93
+ data.input.streamPartialToolCalls = true;
94
+ }
95
+ }
96
+ async handleSuccess(data, _meta) {
97
+ if (this.output.messages.length === 0) {
98
+ await this.handleNewToken({
99
+ value: data.value,
100
+ callbacks: {
101
+ abort: /* @__PURE__ */ __name(() => {
102
+ }, "abort")
103
+ }
104
+ }, _meta);
105
+ }
106
+ }
107
+ async handleNewToken(data, _meta) {
108
+ await this.output.merge(data.value);
109
+ const toolCalls = this.output.getToolCalls();
110
+ if (toolCalls.length > 0) {
111
+ for (const toolCall2 of toolCalls) {
112
+ await this.process(toolCall2.toolName, toolCall2.input);
113
+ }
114
+ return;
115
+ }
116
+ const textContent = this.output.getTextContent();
117
+ const toolCall = schema_cjs.parseBrokenJson(textContent, {
118
+ pair: [
119
+ "{",
120
+ "}"
121
+ ]
122
+ });
123
+ if (!toolCall || !remeda.isPlainObject(toolCall)) {
124
+ return;
125
+ }
126
+ await this.process(toolCall.name, toolCall.parameters);
127
+ }
128
+ }
129
+
130
+ exports.StreamToolCallMiddleware = StreamToolCallMiddleware;
131
+ //# sourceMappingURL=streamToolCall.cjs.map
132
+ //# sourceMappingURL=streamToolCall.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleNewToken","handleSuccess","unbind","length","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","value","callbacks","abort","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n // Reset state\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
@@ -0,0 +1,94 @@
1
+ import { Middleware, RunInstance, RunContext } from '../context.cjs';
2
+ import { C as Callback, E as Emitter, a as EmitterOptions } from '../emitter-jN55XZZq.cjs';
3
+ import { Tool } from '../tools/base.cjs';
4
+ import '../internals/serializable.cjs';
5
+ import '../internals/types.cjs';
6
+ import '../internals/helpers/guards.cjs';
7
+ import '../internals/helpers/promise.cjs';
8
+ import '../errors.cjs';
9
+ import 'ajv';
10
+ import 'promise-based-task';
11
+ import '../cache/base.cjs';
12
+ import '../internals/helpers/schema.cjs';
13
+ import 'zod';
14
+ import 'zod-to-json-schema';
15
+
16
+ /**
17
+ * Copyright 2025 © BeeAI a Series of LF Projects, LLC
18
+ * SPDX-License-Identifier: Apache-2.0
19
+ */
20
+
21
+ /**
22
+ * Event emitted when the middleware detects an update to the target tool's arguments
23
+ */
24
+ interface StreamToolCallMiddlewareUpdateEvent<T = any> {
25
+ /** The validated and structured tool input */
26
+ outputStructured: T | null;
27
+ /** The current value of the target field */
28
+ output: string;
29
+ /** The incremental change since the last update */
30
+ delta: string;
31
+ }
32
+ /**
33
+ * Callbacks for StreamToolCallMiddleware events
34
+ */
35
+ interface StreamToolCallMiddlewareCallbacks<T = any> {
36
+ update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;
37
+ }
38
+ /**
39
+ * Options for configuring StreamToolCallMiddleware
40
+ */
41
+ interface StreamToolCallMiddlewareOptions {
42
+ /** The tool to monitor for streaming updates */
43
+ target: Tool<any>;
44
+ /** The field name in the tool's input schema to stream */
45
+ key: string;
46
+ /** Whether to apply middleware to nested run contexts */
47
+ matchNested?: boolean;
48
+ /** Whether to force streaming on the ChatModel */
49
+ forceStreaming?: boolean;
50
+ }
51
+ /**
52
+ * Middleware for handling streaming tool calls in a ChatModel.
53
+ *
54
+ * This middleware observes and listens to ChatModel stream updates and parses
55
+ * the tool calls on demand so that they can be consumed as soon as possible.
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const middleware = new StreamToolCallMiddleware({
60
+ * target: thinkTool,
61
+ * key: "thoughts",
62
+ * matchNested: false,
63
+ * forceStreaming: true,
64
+ * });
65
+ *
66
+ * middleware.emitter.on("update", (event) => {
67
+ * console.log("Delta:", event.delta);
68
+ * console.log("Structured:", event.outputStructured);
69
+ * });
70
+ *
71
+ * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);
72
+ * ```
73
+ */
74
+ declare class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {
75
+ private readonly target;
76
+ private readonly key;
77
+ private readonly matchNested;
78
+ private readonly forceStreaming;
79
+ private readonly cleanups;
80
+ private output;
81
+ private buffer;
82
+ private delta;
83
+ readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;
84
+ constructor(options: StreamToolCallMiddlewareOptions);
85
+ bind(ctx: RunContext<RunInstance>): void;
86
+ unbind(): void;
87
+ protected createEmitterOptions(): EmitterOptions;
88
+ private process;
89
+ private handleStart;
90
+ private handleSuccess;
91
+ private handleNewToken;
92
+ }
93
+
94
+ export { StreamToolCallMiddleware, type StreamToolCallMiddlewareCallbacks, type StreamToolCallMiddlewareOptions, type StreamToolCallMiddlewareUpdateEvent };
@@ -0,0 +1,94 @@
1
+ import { Middleware, RunInstance, RunContext } from '../context.js';
2
+ import { C as Callback, E as Emitter, a as EmitterOptions } from '../emitter-36-9MnvA.js';
3
+ import { Tool } from '../tools/base.js';
4
+ import '../internals/serializable.js';
5
+ import '../internals/types.js';
6
+ import '../internals/helpers/guards.js';
7
+ import '../internals/helpers/promise.js';
8
+ import '../errors.js';
9
+ import 'ajv';
10
+ import 'promise-based-task';
11
+ import '../cache/base.js';
12
+ import '../internals/helpers/schema.js';
13
+ import 'zod';
14
+ import 'zod-to-json-schema';
15
+
16
+ /**
17
+ * Copyright 2025 © BeeAI a Series of LF Projects, LLC
18
+ * SPDX-License-Identifier: Apache-2.0
19
+ */
20
+
21
+ /**
22
+ * Event emitted when the middleware detects an update to the target tool's arguments
23
+ */
24
+ interface StreamToolCallMiddlewareUpdateEvent<T = any> {
25
+ /** The validated and structured tool input */
26
+ outputStructured: T | null;
27
+ /** The current value of the target field */
28
+ output: string;
29
+ /** The incremental change since the last update */
30
+ delta: string;
31
+ }
32
+ /**
33
+ * Callbacks for StreamToolCallMiddleware events
34
+ */
35
+ interface StreamToolCallMiddlewareCallbacks<T = any> {
36
+ update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;
37
+ }
38
+ /**
39
+ * Options for configuring StreamToolCallMiddleware
40
+ */
41
+ interface StreamToolCallMiddlewareOptions {
42
+ /** The tool to monitor for streaming updates */
43
+ target: Tool<any>;
44
+ /** The field name in the tool's input schema to stream */
45
+ key: string;
46
+ /** Whether to apply middleware to nested run contexts */
47
+ matchNested?: boolean;
48
+ /** Whether to force streaming on the ChatModel */
49
+ forceStreaming?: boolean;
50
+ }
51
+ /**
52
+ * Middleware for handling streaming tool calls in a ChatModel.
53
+ *
54
+ * This middleware observes and listens to ChatModel stream updates and parses
55
+ * the tool calls on demand so that they can be consumed as soon as possible.
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const middleware = new StreamToolCallMiddleware({
60
+ * target: thinkTool,
61
+ * key: "thoughts",
62
+ * matchNested: false,
63
+ * forceStreaming: true,
64
+ * });
65
+ *
66
+ * middleware.emitter.on("update", (event) => {
67
+ * console.log("Delta:", event.delta);
68
+ * console.log("Structured:", event.outputStructured);
69
+ * });
70
+ *
71
+ * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);
72
+ * ```
73
+ */
74
+ declare class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {
75
+ private readonly target;
76
+ private readonly key;
77
+ private readonly matchNested;
78
+ private readonly forceStreaming;
79
+ private readonly cleanups;
80
+ private output;
81
+ private buffer;
82
+ private delta;
83
+ readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;
84
+ constructor(options: StreamToolCallMiddlewareOptions);
85
+ bind(ctx: RunContext<RunInstance>): void;
86
+ unbind(): void;
87
+ protected createEmitterOptions(): EmitterOptions;
88
+ private process;
89
+ private handleStart;
90
+ private handleSuccess;
91
+ private handleNewToken;
92
+ }
93
+
94
+ export { StreamToolCallMiddleware, type StreamToolCallMiddlewareCallbacks, type StreamToolCallMiddlewareOptions, type StreamToolCallMiddlewareUpdateEvent };
@@ -0,0 +1,130 @@
1
+ import { Middleware } from '../context.js';
2
+ import { Emitter } from '../emitter/emitter.js';
3
+ import { ChatModelOutput, ChatModel } from '../backend/chat.js';
4
+ import { parseBrokenJson } from '../internals/helpers/schema.js';
5
+ import { isString, isPlainObject } from 'remeda';
6
+ import { hasProp } from '../internals/helpers/object.js';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ class StreamToolCallMiddleware extends Middleware {
11
+ static {
12
+ __name(this, "StreamToolCallMiddleware");
13
+ }
14
+ target;
15
+ key;
16
+ matchNested;
17
+ forceStreaming;
18
+ cleanups = [];
19
+ output = new ChatModelOutput([]);
20
+ buffer = "";
21
+ delta = "";
22
+ emitter;
23
+ constructor(options) {
24
+ super();
25
+ this.target = options.target;
26
+ this.key = options.key;
27
+ this.matchNested = options.matchNested ?? false;
28
+ this.forceStreaming = options.forceStreaming ?? false;
29
+ this.emitter = Emitter.root.child({
30
+ namespace: [
31
+ "middleware",
32
+ "streamToolCall"
33
+ ]
34
+ });
35
+ }
36
+ bind(ctx) {
37
+ this.output = new ChatModelOutput([]);
38
+ this.buffer = "";
39
+ this.delta = "";
40
+ this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof ChatModel && meta.name === "start", this.handleStart.bind(this), this.createEmitterOptions()));
41
+ this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof ChatModel && meta.name === "newToken", this.handleNewToken.bind(this), this.createEmitterOptions()));
42
+ this.cleanups.push(ctx.instance.emitter.match((meta) => meta.creator instanceof ChatModel && meta.name === "success", this.handleSuccess.bind(this), this.createEmitterOptions()));
43
+ }
44
+ unbind() {
45
+ while (this.cleanups.length > 0) {
46
+ const fn = this.cleanups.shift();
47
+ fn();
48
+ }
49
+ }
50
+ createEmitterOptions() {
51
+ return {
52
+ matchNested: this.matchNested,
53
+ isBlocking: true
54
+ };
55
+ }
56
+ async process(toolName, args) {
57
+ if (toolName !== this.target.name) {
58
+ return;
59
+ }
60
+ const parsedArgs = isString(args) ? parseBrokenJson(args, {
61
+ pair: [
62
+ "{",
63
+ "}"
64
+ ]
65
+ }) : args;
66
+ const outputStructured = await this.target.parse(parsedArgs).catch(() => null);
67
+ if (!outputStructured) {
68
+ return;
69
+ }
70
+ let output = "";
71
+ if (hasProp(outputStructured, this.key)) {
72
+ output = outputStructured[this.key] || "";
73
+ if (!isString(output)) {
74
+ output = JSON.stringify(output);
75
+ }
76
+ this.delta = output.slice(this.buffer.length);
77
+ this.buffer = output;
78
+ if (!this.delta) {
79
+ return;
80
+ }
81
+ }
82
+ await this.emitter.emit("update", {
83
+ outputStructured,
84
+ delta: this.delta,
85
+ output
86
+ });
87
+ }
88
+ async handleStart(data, _meta) {
89
+ if (this.forceStreaming) {
90
+ data.input.stream = true;
91
+ data.input.streamPartialToolCalls = true;
92
+ }
93
+ }
94
+ async handleSuccess(data, _meta) {
95
+ if (this.output.messages.length === 0) {
96
+ await this.handleNewToken({
97
+ value: data.value,
98
+ callbacks: {
99
+ abort: /* @__PURE__ */ __name(() => {
100
+ }, "abort")
101
+ }
102
+ }, _meta);
103
+ }
104
+ }
105
+ async handleNewToken(data, _meta) {
106
+ await this.output.merge(data.value);
107
+ const toolCalls = this.output.getToolCalls();
108
+ if (toolCalls.length > 0) {
109
+ for (const toolCall2 of toolCalls) {
110
+ await this.process(toolCall2.toolName, toolCall2.input);
111
+ }
112
+ return;
113
+ }
114
+ const textContent = this.output.getTextContent();
115
+ const toolCall = parseBrokenJson(textContent, {
116
+ pair: [
117
+ "{",
118
+ "}"
119
+ ]
120
+ });
121
+ if (!toolCall || !isPlainObject(toolCall)) {
122
+ return;
123
+ }
124
+ await this.process(toolCall.name, toolCall.parameters);
125
+ }
126
+ }
127
+
128
+ export { StreamToolCallMiddleware };
129
+ //# sourceMappingURL=streamToolCall.js.map
130
+ //# sourceMappingURL=streamToolCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleNewToken","handleSuccess","unbind","length","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","value","callbacks","abort","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n // Reset state\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}