beeai-framework 0.1.28 → 0.1.30

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 (564) hide show
  1. package/dist/adapters/a2a/agents/agent.cjs.map +1 -1
  2. package/dist/adapters/a2a/agents/agent.d.cts +2 -2
  3. package/dist/adapters/a2a/agents/agent.d.ts +2 -2
  4. package/dist/adapters/a2a/agents/agent.js.map +1 -1
  5. package/dist/adapters/a2a/agents/events.d.cts +1 -1
  6. package/dist/adapters/a2a/agents/events.d.ts +1 -1
  7. package/dist/adapters/a2a/agents/types.d.cts +2 -2
  8. package/dist/adapters/a2a/agents/types.d.ts +2 -2
  9. package/dist/adapters/a2a/agents/utils.cjs +52 -11
  10. package/dist/adapters/a2a/agents/utils.cjs.map +1 -1
  11. package/dist/adapters/a2a/agents/utils.js +52 -11
  12. package/dist/adapters/a2a/agents/utils.js.map +1 -1
  13. package/dist/adapters/a2a/serve/agent_executor.cjs.map +1 -1
  14. package/dist/adapters/a2a/serve/agent_executor.d.cts +3 -3
  15. package/dist/adapters/a2a/serve/agent_executor.d.ts +3 -3
  16. package/dist/adapters/a2a/serve/agent_executor.js.map +1 -1
  17. package/dist/adapters/a2a/serve/server.cjs.map +1 -1
  18. package/dist/adapters/a2a/serve/server.d.cts +2 -2
  19. package/dist/adapters/a2a/serve/server.d.ts +2 -2
  20. package/dist/adapters/a2a/serve/server.js.map +1 -1
  21. package/dist/adapters/acp/agents/agent.cjs.map +1 -1
  22. package/dist/adapters/acp/agents/agent.d.cts +2 -2
  23. package/dist/adapters/acp/agents/agent.d.ts +2 -2
  24. package/dist/adapters/acp/agents/agent.js.map +1 -1
  25. package/dist/adapters/acp/agents/events.d.cts +1 -1
  26. package/dist/adapters/acp/agents/events.d.ts +1 -1
  27. package/dist/adapters/agentstack/agents/agent.cjs.map +1 -1
  28. package/dist/adapters/agentstack/agents/agent.d.cts +2 -2
  29. package/dist/adapters/agentstack/agents/agent.d.ts +2 -2
  30. package/dist/adapters/agentstack/agents/agent.js.map +1 -1
  31. package/dist/adapters/agentstack/agents/events.d.cts +1 -1
  32. package/dist/adapters/agentstack/agents/events.d.ts +1 -1
  33. package/dist/adapters/amazon-bedrock/backend/chat.cjs.map +1 -1
  34. package/dist/adapters/amazon-bedrock/backend/chat.d.cts +2 -2
  35. package/dist/adapters/amazon-bedrock/backend/chat.d.ts +2 -2
  36. package/dist/adapters/amazon-bedrock/backend/chat.js.map +1 -1
  37. package/dist/adapters/amazon-bedrock/backend/client.cjs.map +1 -1
  38. package/dist/adapters/amazon-bedrock/backend/client.js.map +1 -1
  39. package/dist/adapters/amazon-bedrock/backend/embedding.cjs.map +1 -1
  40. package/dist/adapters/amazon-bedrock/backend/embedding.d.cts +2 -2
  41. package/dist/adapters/amazon-bedrock/backend/embedding.d.ts +2 -2
  42. package/dist/adapters/amazon-bedrock/backend/embedding.js.map +1 -1
  43. package/dist/adapters/anthropic/backend/chat.cjs.map +1 -1
  44. package/dist/adapters/anthropic/backend/chat.d.cts +3 -3
  45. package/dist/adapters/anthropic/backend/chat.d.ts +3 -3
  46. package/dist/adapters/anthropic/backend/chat.js.map +1 -1
  47. package/dist/adapters/anthropic/backend/client.cjs.map +1 -1
  48. package/dist/adapters/anthropic/backend/client.js.map +1 -1
  49. package/dist/adapters/anthropic/backend/embedding.cjs.map +1 -1
  50. package/dist/adapters/anthropic/backend/embedding.d.cts +2 -2
  51. package/dist/adapters/anthropic/backend/embedding.d.ts +2 -2
  52. package/dist/adapters/anthropic/backend/embedding.js.map +1 -1
  53. package/dist/adapters/azure-openai/backend/chat.cjs.map +1 -1
  54. package/dist/adapters/azure-openai/backend/chat.d.cts +3 -3
  55. package/dist/adapters/azure-openai/backend/chat.d.ts +3 -3
  56. package/dist/adapters/azure-openai/backend/chat.js.map +1 -1
  57. package/dist/adapters/azure-openai/backend/client.cjs.map +1 -1
  58. package/dist/adapters/azure-openai/backend/client.js.map +1 -1
  59. package/dist/adapters/azure-openai/backend/embedding.cjs.map +1 -1
  60. package/dist/adapters/azure-openai/backend/embedding.d.cts +2 -2
  61. package/dist/adapters/azure-openai/backend/embedding.d.ts +2 -2
  62. package/dist/adapters/azure-openai/backend/embedding.js.map +1 -1
  63. package/dist/adapters/dummy/backend/chat.cjs.map +1 -1
  64. package/dist/adapters/dummy/backend/chat.d.cts +2 -2
  65. package/dist/adapters/dummy/backend/chat.d.ts +2 -2
  66. package/dist/adapters/dummy/backend/chat.js.map +1 -1
  67. package/dist/adapters/dummy/backend/embedding.cjs.map +1 -1
  68. package/dist/adapters/dummy/backend/embedding.d.cts +2 -2
  69. package/dist/adapters/dummy/backend/embedding.d.ts +2 -2
  70. package/dist/adapters/dummy/backend/embedding.js.map +1 -1
  71. package/dist/adapters/google-vertex/backend/chat.cjs.map +1 -1
  72. package/dist/adapters/google-vertex/backend/chat.d.cts +3 -3
  73. package/dist/adapters/google-vertex/backend/chat.d.ts +3 -3
  74. package/dist/adapters/google-vertex/backend/chat.js.map +1 -1
  75. package/dist/adapters/google-vertex/backend/client.cjs.map +1 -1
  76. package/dist/adapters/google-vertex/backend/client.js.map +1 -1
  77. package/dist/adapters/google-vertex/backend/embedding.cjs.map +1 -1
  78. package/dist/adapters/google-vertex/backend/embedding.d.cts +2 -2
  79. package/dist/adapters/google-vertex/backend/embedding.d.ts +2 -2
  80. package/dist/adapters/google-vertex/backend/embedding.js.map +1 -1
  81. package/dist/adapters/groq/backend/chat.cjs.map +1 -1
  82. package/dist/adapters/groq/backend/chat.d.cts +3 -3
  83. package/dist/adapters/groq/backend/chat.d.ts +3 -3
  84. package/dist/adapters/groq/backend/chat.js.map +1 -1
  85. package/dist/adapters/groq/backend/client.cjs.map +1 -1
  86. package/dist/adapters/groq/backend/client.js.map +1 -1
  87. package/dist/adapters/groq/backend/embedding.cjs.map +1 -1
  88. package/dist/adapters/groq/backend/embedding.d.cts +2 -2
  89. package/dist/adapters/groq/backend/embedding.d.ts +2 -2
  90. package/dist/adapters/groq/backend/embedding.js.map +1 -1
  91. package/dist/adapters/langchain/backend/chat.cjs +6 -28
  92. package/dist/adapters/langchain/backend/chat.cjs.map +1 -1
  93. package/dist/adapters/langchain/backend/chat.d.cts +6 -5
  94. package/dist/adapters/langchain/backend/chat.d.ts +6 -5
  95. package/dist/adapters/langchain/backend/chat.js +6 -28
  96. package/dist/adapters/langchain/backend/chat.js.map +1 -1
  97. package/dist/adapters/langchain/backend/embedding.cjs +3 -2
  98. package/dist/adapters/langchain/backend/embedding.cjs.map +1 -1
  99. package/dist/adapters/langchain/backend/embedding.d.cts +3 -3
  100. package/dist/adapters/langchain/backend/embedding.d.ts +3 -3
  101. package/dist/adapters/langchain/backend/embedding.js +3 -2
  102. package/dist/adapters/langchain/backend/embedding.js.map +1 -1
  103. package/dist/adapters/langchain/backend/utils.cjs +328 -0
  104. package/dist/adapters/langchain/backend/utils.cjs.map +1 -0
  105. package/dist/adapters/langchain/backend/utils.d.cts +39 -0
  106. package/dist/adapters/langchain/backend/utils.d.ts +39 -0
  107. package/dist/adapters/langchain/backend/utils.js +324 -0
  108. package/dist/adapters/langchain/backend/utils.js.map +1 -0
  109. package/dist/adapters/langchain/tools.cjs.map +1 -1
  110. package/dist/adapters/langchain/tools.d.cts +2 -2
  111. package/dist/adapters/langchain/tools.d.ts +2 -2
  112. package/dist/adapters/langchain/tools.js.map +1 -1
  113. package/dist/adapters/mcp/serve/http_server.cjs.map +1 -1
  114. package/dist/adapters/mcp/serve/http_server.js.map +1 -1
  115. package/dist/adapters/mcp/serve/in_memory_store.cjs.map +1 -1
  116. package/dist/adapters/mcp/serve/in_memory_store.js.map +1 -1
  117. package/dist/adapters/mcp/serve/server.cjs.map +1 -1
  118. package/dist/adapters/mcp/serve/server.js.map +1 -1
  119. package/dist/adapters/minimax/backend/chat.cjs +25 -0
  120. package/dist/adapters/minimax/backend/chat.cjs.map +1 -0
  121. package/dist/adapters/minimax/backend/chat.d.cts +38 -0
  122. package/dist/adapters/minimax/backend/chat.d.ts +38 -0
  123. package/dist/adapters/minimax/backend/chat.js +23 -0
  124. package/dist/adapters/minimax/backend/chat.js.map +1 -0
  125. package/dist/adapters/minimax/backend/client.cjs +31 -0
  126. package/dist/adapters/minimax/backend/client.cjs.map +1 -0
  127. package/dist/adapters/minimax/backend/client.d.cts +17 -0
  128. package/dist/adapters/minimax/backend/client.d.ts +17 -0
  129. package/dist/adapters/minimax/backend/client.js +29 -0
  130. package/dist/adapters/minimax/backend/client.js.map +1 -0
  131. package/dist/adapters/ollama/backend/chat.cjs.map +1 -1
  132. package/dist/adapters/ollama/backend/chat.d.cts +2 -2
  133. package/dist/adapters/ollama/backend/chat.d.ts +2 -2
  134. package/dist/adapters/ollama/backend/chat.js.map +1 -1
  135. package/dist/adapters/ollama/backend/client.cjs.map +1 -1
  136. package/dist/adapters/ollama/backend/client.js.map +1 -1
  137. package/dist/adapters/ollama/backend/embedding.cjs.map +1 -1
  138. package/dist/adapters/ollama/backend/embedding.d.cts +2 -2
  139. package/dist/adapters/ollama/backend/embedding.d.ts +2 -2
  140. package/dist/adapters/ollama/backend/embedding.js.map +1 -1
  141. package/dist/adapters/openai/backend/chat.cjs.map +1 -1
  142. package/dist/adapters/openai/backend/chat.d.cts +2 -2
  143. package/dist/adapters/openai/backend/chat.d.ts +2 -2
  144. package/dist/adapters/openai/backend/chat.js.map +1 -1
  145. package/dist/adapters/openai/backend/client.cjs.map +1 -1
  146. package/dist/adapters/openai/backend/client.js.map +1 -1
  147. package/dist/adapters/openai/backend/embedding.cjs.map +1 -1
  148. package/dist/adapters/openai/backend/embedding.d.cts +2 -2
  149. package/dist/adapters/openai/backend/embedding.d.ts +2 -2
  150. package/dist/adapters/openai/backend/embedding.js.map +1 -1
  151. package/dist/adapters/vercel/backend/chat.cjs.map +1 -1
  152. package/dist/adapters/vercel/backend/chat.d.cts +2 -2
  153. package/dist/adapters/vercel/backend/chat.d.ts +2 -2
  154. package/dist/adapters/vercel/backend/chat.js.map +1 -1
  155. package/dist/adapters/vercel/backend/embedding.cjs.map +1 -1
  156. package/dist/adapters/vercel/backend/embedding.d.cts +2 -2
  157. package/dist/adapters/vercel/backend/embedding.d.ts +2 -2
  158. package/dist/adapters/vercel/backend/embedding.js.map +1 -1
  159. package/dist/adapters/vercel/backend/utils.cjs.map +1 -1
  160. package/dist/adapters/vercel/backend/utils.d.cts +2 -2
  161. package/dist/adapters/vercel/backend/utils.d.ts +2 -2
  162. package/dist/adapters/vercel/backend/utils.js.map +1 -1
  163. package/dist/adapters/watsonx/backend/chat.cjs.map +1 -1
  164. package/dist/adapters/watsonx/backend/chat.d.cts +2 -2
  165. package/dist/adapters/watsonx/backend/chat.d.ts +2 -2
  166. package/dist/adapters/watsonx/backend/chat.js +1 -1
  167. package/dist/adapters/watsonx/backend/chat.js.map +1 -1
  168. package/dist/adapters/watsonx/backend/client.cjs.map +1 -1
  169. package/dist/adapters/watsonx/backend/client.js.map +1 -1
  170. package/dist/adapters/watsonx/backend/embedding.cjs.map +1 -1
  171. package/dist/adapters/watsonx/backend/embedding.d.cts +2 -2
  172. package/dist/adapters/watsonx/backend/embedding.d.ts +2 -2
  173. package/dist/adapters/watsonx/backend/embedding.js.map +1 -1
  174. package/dist/adapters/xai/backend/chat.cjs.map +1 -1
  175. package/dist/adapters/xai/backend/chat.d.cts +2 -2
  176. package/dist/adapters/xai/backend/chat.d.ts +2 -2
  177. package/dist/adapters/xai/backend/chat.js.map +1 -1
  178. package/dist/adapters/xai/backend/client.cjs.map +1 -1
  179. package/dist/adapters/xai/backend/client.js.map +1 -1
  180. package/dist/{agent-BAVf6-xf.d.ts → agent-s3uhvAba.d.ts} +5 -5
  181. package/dist/{agent-DHO-oJQf.d.cts → agent-zfT__iq9.d.cts} +5 -5
  182. package/dist/agents/base.cjs.map +1 -1
  183. package/dist/agents/base.d.cts +2 -2
  184. package/dist/agents/base.d.ts +2 -2
  185. package/dist/agents/base.js.map +1 -1
  186. package/dist/agents/experimental/replan/agent.cjs.map +1 -1
  187. package/dist/agents/experimental/replan/agent.d.cts +3 -3
  188. package/dist/agents/experimental/replan/agent.d.ts +3 -3
  189. package/dist/agents/experimental/replan/agent.js.map +1 -1
  190. package/dist/agents/experimental/replan/prompts.cjs.map +1 -1
  191. package/dist/agents/experimental/replan/prompts.d.cts +1 -1
  192. package/dist/agents/experimental/replan/prompts.d.ts +1 -1
  193. package/dist/agents/experimental/replan/prompts.js.map +1 -1
  194. package/dist/agents/experimental/streamlit/agent.cjs.map +1 -1
  195. package/dist/agents/experimental/streamlit/agent.d.cts +3 -3
  196. package/dist/agents/experimental/streamlit/agent.d.ts +3 -3
  197. package/dist/agents/experimental/streamlit/agent.js.map +1 -1
  198. package/dist/agents/experimental/streamlit/prompts.cjs +2 -2
  199. package/dist/agents/experimental/streamlit/prompts.cjs.map +1 -1
  200. package/dist/agents/experimental/streamlit/prompts.js +2 -2
  201. package/dist/agents/experimental/streamlit/prompts.js.map +1 -1
  202. package/dist/agents/react/agent.cjs +6 -6
  203. package/dist/agents/react/agent.cjs.map +1 -1
  204. package/dist/agents/react/agent.d.cts +4 -4
  205. package/dist/agents/react/agent.d.ts +4 -4
  206. package/dist/agents/react/agent.js.map +1 -1
  207. package/dist/agents/react/prompts.cjs.map +1 -1
  208. package/dist/agents/react/prompts.d.cts +1 -1
  209. package/dist/agents/react/prompts.d.ts +1 -1
  210. package/dist/agents/react/prompts.js.map +1 -1
  211. package/dist/agents/react/runners/base.cjs.map +1 -1
  212. package/dist/agents/react/runners/base.d.cts +4 -4
  213. package/dist/agents/react/runners/base.d.ts +4 -4
  214. package/dist/agents/react/runners/base.js.map +1 -1
  215. package/dist/agents/react/runners/deep-think/prompts.cjs.map +1 -1
  216. package/dist/agents/react/runners/deep-think/prompts.d.cts +1 -1
  217. package/dist/agents/react/runners/deep-think/prompts.d.ts +1 -1
  218. package/dist/agents/react/runners/deep-think/prompts.js.map +1 -1
  219. package/dist/agents/react/runners/deep-think/runner.cjs.map +1 -1
  220. package/dist/agents/react/runners/deep-think/runner.d.cts +5 -5
  221. package/dist/agents/react/runners/deep-think/runner.d.ts +5 -5
  222. package/dist/agents/react/runners/deep-think/runner.js.map +1 -1
  223. package/dist/agents/react/runners/default/runner.cjs.map +1 -1
  224. package/dist/agents/react/runners/default/runner.d.cts +5 -5
  225. package/dist/agents/react/runners/default/runner.d.ts +5 -5
  226. package/dist/agents/react/runners/default/runner.js.map +1 -1
  227. package/dist/agents/react/runners/default/runner.spec.cjs.map +1 -1
  228. package/dist/agents/react/runners/default/runner.spec.js.map +1 -1
  229. package/dist/agents/react/runners/granite/prompts.cjs.map +1 -1
  230. package/dist/agents/react/runners/granite/prompts.d.cts +1 -1
  231. package/dist/agents/react/runners/granite/prompts.d.ts +1 -1
  232. package/dist/agents/react/runners/granite/prompts.js.map +1 -1
  233. package/dist/agents/react/runners/granite/runner.cjs.map +1 -1
  234. package/dist/agents/react/runners/granite/runner.d.cts +5 -5
  235. package/dist/agents/react/runners/granite/runner.d.ts +5 -5
  236. package/dist/agents/react/runners/granite/runner.js.map +1 -1
  237. package/dist/agents/react/types.d.cts +2 -2
  238. package/dist/agents/react/types.d.ts +2 -2
  239. package/dist/agents/requirement/agent.cjs.map +1 -1
  240. package/dist/agents/requirement/agent.d.cts +5 -5
  241. package/dist/agents/requirement/agent.d.ts +5 -5
  242. package/dist/agents/requirement/agent.js.map +1 -1
  243. package/dist/agents/requirement/prompts.d.cts +2 -2
  244. package/dist/agents/requirement/prompts.d.ts +2 -2
  245. package/dist/agents/requirement/requirements/conditional.cjs.map +1 -1
  246. package/dist/agents/requirement/requirements/conditional.d.cts +5 -5
  247. package/dist/agents/requirement/requirements/conditional.d.ts +5 -5
  248. package/dist/agents/requirement/requirements/conditional.js.map +1 -1
  249. package/dist/agents/requirement/requirements/requirement.cjs.map +1 -1
  250. package/dist/agents/requirement/requirements/requirement.d.cts +4 -4
  251. package/dist/agents/requirement/requirements/requirement.d.ts +4 -4
  252. package/dist/agents/requirement/requirements/requirement.js.map +1 -1
  253. package/dist/agents/requirement/requirements/utils.cjs.map +1 -1
  254. package/dist/agents/requirement/requirements/utils.d.cts +1 -1
  255. package/dist/agents/requirement/requirements/utils.d.ts +1 -1
  256. package/dist/agents/requirement/requirements/utils.js.map +1 -1
  257. package/dist/agents/requirement/runner.cjs.map +1 -1
  258. package/dist/agents/requirement/runner.d.cts +5 -5
  259. package/dist/agents/requirement/runner.d.ts +5 -5
  260. package/dist/agents/requirement/runner.js.map +1 -1
  261. package/dist/agents/requirement/types.d.cts +4 -4
  262. package/dist/agents/requirement/types.d.ts +4 -4
  263. package/dist/agents/requirement/utils/llm.cjs.map +1 -1
  264. package/dist/agents/requirement/utils/llm.d.cts +4 -4
  265. package/dist/agents/requirement/utils/llm.d.ts +4 -4
  266. package/dist/agents/requirement/utils/llm.js.map +1 -1
  267. package/dist/agents/requirement/utils/tool.cjs.map +1 -1
  268. package/dist/agents/requirement/utils/tool.d.cts +4 -4
  269. package/dist/agents/requirement/utils/tool.d.ts +4 -4
  270. package/dist/agents/requirement/utils/tool.js.map +1 -1
  271. package/dist/agents/requirement/utils/toolCallChecker.cjs.map +1 -1
  272. package/dist/agents/requirement/utils/toolCallChecker.js.map +1 -1
  273. package/dist/agents/toolCalling/agent.cjs.map +1 -1
  274. package/dist/agents/toolCalling/agent.d.cts +4 -4
  275. package/dist/agents/toolCalling/agent.d.ts +4 -4
  276. package/dist/agents/toolCalling/agent.js.map +1 -1
  277. package/dist/agents/toolCalling/prompts.cjs.map +1 -1
  278. package/dist/agents/toolCalling/prompts.js.map +1 -1
  279. package/dist/agents/toolCalling/types.d.cts +1 -1
  280. package/dist/agents/toolCalling/types.d.ts +1 -1
  281. package/dist/agents/types.d.cts +2 -2
  282. package/dist/agents/types.d.ts +2 -2
  283. package/dist/backend/backend.cjs.map +1 -1
  284. package/dist/backend/backend.d.cts +3 -3
  285. package/dist/backend/backend.d.ts +3 -3
  286. package/dist/backend/backend.js.map +1 -1
  287. package/dist/backend/chat.cjs.map +1 -1
  288. package/dist/backend/chat.d.cts +2 -2
  289. package/dist/backend/chat.d.ts +2 -2
  290. package/dist/backend/chat.js.map +1 -1
  291. package/dist/backend/client.cjs.map +1 -1
  292. package/dist/backend/client.js.map +1 -1
  293. package/dist/backend/constants.cjs +7 -0
  294. package/dist/backend/constants.cjs.map +1 -1
  295. package/dist/backend/constants.d.cts +5 -0
  296. package/dist/backend/constants.d.ts +5 -0
  297. package/dist/backend/constants.js +7 -0
  298. package/dist/backend/constants.js.map +1 -1
  299. package/dist/backend/core.d.cts +2 -2
  300. package/dist/backend/core.d.ts +2 -2
  301. package/dist/backend/embedding.cjs.map +1 -1
  302. package/dist/backend/embedding.d.cts +2 -2
  303. package/dist/backend/embedding.d.ts +2 -2
  304. package/dist/backend/embedding.js.map +1 -1
  305. package/dist/backend/errors.cjs.map +1 -1
  306. package/dist/backend/errors.d.cts +2 -2
  307. package/dist/backend/errors.d.ts +2 -2
  308. package/dist/backend/errors.js.map +1 -1
  309. package/dist/backend/message.cjs.map +1 -1
  310. package/dist/backend/message.js.map +1 -1
  311. package/dist/backend/utils.cjs.map +1 -1
  312. package/dist/backend/utils.d.cts +2 -2
  313. package/dist/backend/utils.d.ts +2 -2
  314. package/dist/backend/utils.js.map +1 -1
  315. package/dist/{base-BfhNzUYf.d.ts → base-BjzyQ8k6.d.ts} +2 -2
  316. package/dist/{base-BqzN2QwB.d.cts → base-s3ioVIE9.d.cts} +2 -2
  317. package/dist/cache/decoratorCache.cjs.map +1 -1
  318. package/dist/cache/decoratorCache.js.map +1 -1
  319. package/dist/cache/fileCache.cjs.map +1 -1
  320. package/dist/cache/fileCache.js.map +1 -1
  321. package/dist/cache/nullCache.cjs.map +1 -1
  322. package/dist/cache/nullCache.js.map +1 -1
  323. package/dist/cache/slidingCache.cjs.map +1 -1
  324. package/dist/cache/slidingCache.js.map +1 -1
  325. package/dist/cache/unconstrainedCache.cjs.map +1 -1
  326. package/dist/cache/unconstrainedCache.js.map +1 -1
  327. package/dist/{chat-DaqV3woF.d.cts → chat-C20nYj46.d.cts} +3 -3
  328. package/dist/{chat-DTxmaKP0.d.ts → chat-CfTNfR60.d.ts} +3 -3
  329. package/dist/context.cjs.map +1 -1
  330. package/dist/context.d.cts +1 -1
  331. package/dist/context.d.ts +1 -1
  332. package/dist/context.js.map +1 -1
  333. package/dist/emitter/emitter.cjs.map +1 -1
  334. package/dist/emitter/emitter.d.cts +1 -1
  335. package/dist/emitter/emitter.d.ts +1 -1
  336. package/dist/emitter/emitter.js.map +1 -1
  337. package/dist/emitter/types.d.cts +1 -1
  338. package/dist/emitter/types.d.ts +1 -1
  339. package/dist/emitter/utils.cjs.map +1 -1
  340. package/dist/emitter/utils.js.map +1 -1
  341. package/dist/{emitter-UkIkNrek.d.cts → emitter-D4OcelZ9.d.cts} +2 -2
  342. package/dist/{emitter-CL56qab4.d.ts → emitter-kHxkUxco.d.ts} +2 -2
  343. package/dist/errors.cjs.map +1 -1
  344. package/dist/errors.js.map +1 -1
  345. package/dist/index.d.cts +4 -4
  346. package/dist/index.d.ts +4 -4
  347. package/dist/internals/env.cjs.map +1 -1
  348. package/dist/internals/env.js.map +1 -1
  349. package/dist/internals/fetcher.cjs.map +1 -1
  350. package/dist/internals/fetcher.d.cts +1 -1
  351. package/dist/internals/fetcher.d.ts +1 -1
  352. package/dist/internals/fetcher.js.map +1 -1
  353. package/dist/internals/helpers/array.cjs.map +1 -1
  354. package/dist/internals/helpers/array.js.map +1 -1
  355. package/dist/internals/helpers/cancellation.cjs.map +1 -1
  356. package/dist/internals/helpers/cancellation.js.map +1 -1
  357. package/dist/internals/helpers/counter.cjs.map +1 -1
  358. package/dist/internals/helpers/counter.js.map +1 -1
  359. package/dist/internals/helpers/general.cjs.map +1 -1
  360. package/dist/internals/helpers/general.js.map +1 -1
  361. package/dist/internals/helpers/hash.cjs.map +1 -1
  362. package/dist/internals/helpers/hash.js.map +1 -1
  363. package/dist/internals/helpers/map.cjs.map +1 -1
  364. package/dist/internals/helpers/map.js.map +1 -1
  365. package/dist/internals/helpers/math.cjs.map +1 -1
  366. package/dist/internals/helpers/math.js.map +1 -1
  367. package/dist/internals/helpers/object.cjs +7 -1
  368. package/dist/internals/helpers/object.cjs.map +1 -1
  369. package/dist/internals/helpers/object.js +7 -1
  370. package/dist/internals/helpers/object.js.map +1 -1
  371. package/dist/internals/helpers/paginate.cjs.map +1 -1
  372. package/dist/internals/helpers/paginate.js.map +1 -1
  373. package/dist/internals/helpers/promise.cjs.map +1 -1
  374. package/dist/internals/helpers/promise.js.map +1 -1
  375. package/dist/internals/helpers/prototype.cjs.map +1 -1
  376. package/dist/internals/helpers/prototype.js.map +1 -1
  377. package/dist/internals/helpers/retry.cjs.map +1 -1
  378. package/dist/internals/helpers/retry.js.map +1 -1
  379. package/dist/internals/helpers/retryable.cjs.map +1 -1
  380. package/dist/internals/helpers/retryable.js.map +1 -1
  381. package/dist/internals/helpers/schema.cjs.map +1 -1
  382. package/dist/internals/helpers/schema.d.cts +4 -4
  383. package/dist/internals/helpers/schema.d.ts +4 -4
  384. package/dist/internals/helpers/schema.js.map +1 -1
  385. package/dist/internals/helpers/stream.cjs.map +1 -1
  386. package/dist/internals/helpers/stream.js.map +1 -1
  387. package/dist/internals/helpers/string.cjs.map +1 -1
  388. package/dist/internals/helpers/string.js.map +1 -1
  389. package/dist/internals/helpers/weakRef.cjs.map +1 -1
  390. package/dist/internals/helpers/weakRef.js.map +1 -1
  391. package/dist/internals/serializable.cjs +3 -1
  392. package/dist/internals/serializable.cjs.map +1 -1
  393. package/dist/internals/serializable.d.cts +6 -0
  394. package/dist/internals/serializable.d.ts +6 -0
  395. package/dist/internals/serializable.js +3 -1
  396. package/dist/internals/serializable.js.map +1 -1
  397. package/dist/internals/types.cjs.map +1 -1
  398. package/dist/internals/types.js.map +1 -1
  399. package/dist/logger/logger.cjs.map +1 -1
  400. package/dist/logger/logger.d.cts +2 -2
  401. package/dist/logger/logger.d.ts +2 -2
  402. package/dist/logger/logger.js +2 -2
  403. package/dist/logger/logger.js.map +1 -1
  404. package/dist/logger/pretty.cjs.map +1 -1
  405. package/dist/logger/pretty.js.map +1 -1
  406. package/dist/memory/base.cjs.map +1 -1
  407. package/dist/memory/base.js.map +1 -1
  408. package/dist/memory/slidingMemory.cjs.map +1 -1
  409. package/dist/memory/slidingMemory.js.map +1 -1
  410. package/dist/memory/summarizeMemory.cjs.map +1 -1
  411. package/dist/memory/summarizeMemory.d.cts +2 -2
  412. package/dist/memory/summarizeMemory.d.ts +2 -2
  413. package/dist/memory/summarizeMemory.js.map +1 -1
  414. package/dist/memory/tokenMemory.cjs.map +1 -1
  415. package/dist/memory/tokenMemory.js.map +1 -1
  416. package/dist/memory/unconstrainedMemory.cjs.map +1 -1
  417. package/dist/memory/unconstrainedMemory.js.map +1 -1
  418. package/dist/middleware/streamToolCall.cjs.map +1 -1
  419. package/dist/middleware/streamToolCall.d.cts +2 -2
  420. package/dist/middleware/streamToolCall.d.ts +2 -2
  421. package/dist/middleware/streamToolCall.js.map +1 -1
  422. package/dist/middleware/trajectory.cjs.map +1 -1
  423. package/dist/middleware/trajectory.d.cts +2 -2
  424. package/dist/middleware/trajectory.d.ts +2 -2
  425. package/dist/middleware/trajectory.js.map +1 -1
  426. package/dist/parsers/errors.cjs.map +1 -1
  427. package/dist/parsers/errors.js.map +1 -1
  428. package/dist/parsers/field.cjs.map +1 -1
  429. package/dist/parsers/field.js.map +1 -1
  430. package/dist/parsers/linePrefix.cjs.map +1 -1
  431. package/dist/parsers/linePrefix.d.cts +1 -1
  432. package/dist/parsers/linePrefix.d.ts +1 -1
  433. package/dist/parsers/linePrefix.js.map +1 -1
  434. package/dist/serializer/error.cjs.map +1 -1
  435. package/dist/serializer/error.js.map +1 -1
  436. package/dist/serializer/serializer.cjs +16 -3
  437. package/dist/serializer/serializer.cjs.map +1 -1
  438. package/dist/serializer/serializer.d.cts +1 -1
  439. package/dist/serializer/serializer.d.ts +1 -1
  440. package/dist/serializer/serializer.js +16 -4
  441. package/dist/serializer/serializer.js.map +1 -1
  442. package/dist/serializer/utils.cjs.map +1 -1
  443. package/dist/serializer/utils.d.cts +1 -1
  444. package/dist/serializer/utils.d.ts +1 -1
  445. package/dist/serializer/utils.js.map +1 -1
  446. package/dist/{serializer-53t8gGQa.d.ts → serializer-BafOT48s.d.ts} +10 -4
  447. package/dist/{serializer-c51B2z6d.d.cts → serializer-CFDWYUco.d.cts} +10 -4
  448. package/dist/serve/server.cjs.map +1 -1
  449. package/dist/serve/server.js.map +1 -1
  450. package/dist/template.cjs.map +1 -1
  451. package/dist/template.js.map +1 -1
  452. package/dist/tools/arxiv.cjs.map +1 -1
  453. package/dist/tools/arxiv.d.cts +2 -2
  454. package/dist/tools/arxiv.d.ts +2 -2
  455. package/dist/tools/arxiv.js.map +1 -1
  456. package/dist/tools/base.cjs.map +1 -1
  457. package/dist/tools/base.d.cts +1 -1
  458. package/dist/tools/base.d.ts +1 -1
  459. package/dist/tools/base.js.map +1 -1
  460. package/dist/tools/calculator.cjs.map +1 -1
  461. package/dist/tools/calculator.d.cts +3 -3
  462. package/dist/tools/calculator.d.ts +3 -3
  463. package/dist/tools/calculator.js.map +1 -1
  464. package/dist/tools/custom.cjs.map +1 -1
  465. package/dist/tools/custom.d.cts +3 -3
  466. package/dist/tools/custom.d.ts +3 -3
  467. package/dist/tools/custom.js.map +1 -1
  468. package/dist/tools/database/elasticsearch.cjs.map +1 -1
  469. package/dist/tools/database/elasticsearch.d.cts +3 -3
  470. package/dist/tools/database/elasticsearch.d.ts +3 -3
  471. package/dist/tools/database/elasticsearch.js.map +1 -1
  472. package/dist/tools/database/metadata.cjs.map +1 -1
  473. package/dist/tools/database/metadata.js.map +1 -1
  474. package/dist/tools/database/milvus.cjs.map +1 -1
  475. package/dist/tools/database/milvus.d.cts +3 -3
  476. package/dist/tools/database/milvus.d.ts +3 -3
  477. package/dist/tools/database/milvus.js.map +1 -1
  478. package/dist/tools/database/qdrant.cjs.map +1 -1
  479. package/dist/tools/database/qdrant.d.cts +2 -2
  480. package/dist/tools/database/qdrant.d.ts +2 -2
  481. package/dist/tools/database/qdrant.js.map +1 -1
  482. package/dist/tools/database/sql.cjs.map +1 -1
  483. package/dist/tools/database/sql.d.cts +2 -2
  484. package/dist/tools/database/sql.d.ts +2 -2
  485. package/dist/tools/database/sql.js.map +1 -1
  486. package/dist/tools/handoff.cjs.map +1 -1
  487. package/dist/tools/handoff.d.cts +2 -2
  488. package/dist/tools/handoff.d.ts +2 -2
  489. package/dist/tools/handoff.js.map +1 -1
  490. package/dist/tools/llm.cjs +1 -1
  491. package/dist/tools/llm.cjs.map +1 -1
  492. package/dist/tools/llm.d.cts +3 -3
  493. package/dist/tools/llm.d.ts +3 -3
  494. package/dist/tools/llm.js +1 -1
  495. package/dist/tools/llm.js.map +1 -1
  496. package/dist/tools/mcp.cjs.map +1 -1
  497. package/dist/tools/mcp.d.cts +2 -2
  498. package/dist/tools/mcp.d.ts +2 -2
  499. package/dist/tools/mcp.js.map +1 -1
  500. package/dist/tools/openapi.cjs.map +1 -1
  501. package/dist/tools/openapi.d.cts +2 -2
  502. package/dist/tools/openapi.d.ts +2 -2
  503. package/dist/tools/openapi.js.map +1 -1
  504. package/dist/tools/python/output.cjs.map +1 -1
  505. package/dist/tools/python/output.d.cts +1 -1
  506. package/dist/tools/python/output.d.ts +1 -1
  507. package/dist/tools/python/output.js.map +1 -1
  508. package/dist/tools/python/python.cjs +5 -2
  509. package/dist/tools/python/python.cjs.map +1 -1
  510. package/dist/tools/python/python.d.cts +3 -3
  511. package/dist/tools/python/python.d.ts +3 -3
  512. package/dist/tools/python/python.js +5 -2
  513. package/dist/tools/python/python.js.map +1 -1
  514. package/dist/tools/python/storage.cjs.map +1 -1
  515. package/dist/tools/python/storage.js.map +1 -1
  516. package/dist/tools/search/base.cjs.map +1 -1
  517. package/dist/tools/search/base.d.cts +2 -2
  518. package/dist/tools/search/base.d.ts +2 -2
  519. package/dist/tools/search/base.js.map +1 -1
  520. package/dist/tools/search/duckDuckGoSearch.cjs.map +1 -1
  521. package/dist/tools/search/duckDuckGoSearch.d.cts +2 -2
  522. package/dist/tools/search/duckDuckGoSearch.d.ts +2 -2
  523. package/dist/tools/search/duckDuckGoSearch.js.map +1 -1
  524. package/dist/tools/search/googleSearch.cjs.map +1 -1
  525. package/dist/tools/search/googleSearch.d.cts +2 -2
  526. package/dist/tools/search/googleSearch.d.ts +2 -2
  527. package/dist/tools/search/googleSearch.js.map +1 -1
  528. package/dist/tools/search/searXNGSearch.cjs.map +1 -1
  529. package/dist/tools/search/searXNGSearch.d.cts +2 -2
  530. package/dist/tools/search/searXNGSearch.d.ts +2 -2
  531. package/dist/tools/search/searXNGSearch.js.map +1 -1
  532. package/dist/tools/search/wikipedia.cjs.map +1 -1
  533. package/dist/tools/search/wikipedia.d.cts +3 -3
  534. package/dist/tools/search/wikipedia.d.ts +3 -3
  535. package/dist/tools/search/wikipedia.js.map +1 -1
  536. package/dist/tools/similarity.cjs.map +1 -1
  537. package/dist/tools/similarity.d.cts +2 -2
  538. package/dist/tools/similarity.d.ts +2 -2
  539. package/dist/tools/similarity.js.map +1 -1
  540. package/dist/tools/think.cjs.map +1 -1
  541. package/dist/tools/think.d.cts +2 -2
  542. package/dist/tools/think.d.ts +2 -2
  543. package/dist/tools/think.js.map +1 -1
  544. package/dist/tools/weather/openMeteo.cjs.map +1 -1
  545. package/dist/tools/weather/openMeteo.d.cts +2 -2
  546. package/dist/tools/weather/openMeteo.d.ts +2 -2
  547. package/dist/tools/weather/openMeteo.js.map +1 -1
  548. package/dist/tools/web/webCrawler.cjs.map +1 -1
  549. package/dist/tools/web/webCrawler.d.cts +2 -2
  550. package/dist/tools/web/webCrawler.d.ts +2 -2
  551. package/dist/tools/web/webCrawler.js.map +1 -1
  552. package/dist/{types-YoNQSxQH.d.cts → types-BNsa3W7Z.d.cts} +4 -4
  553. package/dist/{types-YT-WdK3m.d.ts → types-DYtzF6ya.d.ts} +4 -4
  554. package/dist/version.cjs +1 -1
  555. package/dist/version.js +1 -1
  556. package/dist/workflows/agent.cjs.map +1 -1
  557. package/dist/workflows/agent.d.cts +40 -40
  558. package/dist/workflows/agent.d.ts +40 -40
  559. package/dist/workflows/agent.js.map +1 -1
  560. package/dist/workflows/workflow.cjs.map +1 -1
  561. package/dist/workflows/workflow.d.cts +1 -1
  562. package/dist/workflows/workflow.d.ts +1 -1
  563. package/dist/workflows/workflow.js.map +1 -1
  564. package/package.json +38 -15
@@ -1,4 +1,4 @@
1
- import { JSONToolOutput, Tool, ToolEmitter, ToolInput, BaseToolRunOptions } from './base.cjs';
1
+ import { Tool, JSONToolOutput, ToolEmitter, ToolInput, BaseToolRunOptions } from './base.cjs';
2
2
  import { GetRunContext } from '../context.cjs';
3
3
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
4
  import { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
@@ -12,7 +12,7 @@ import '../cache/base.cjs';
12
12
  import '../internals/helpers/schema.cjs';
13
13
  import 'zod';
14
14
  import 'zod-to-json-schema';
15
- import '../emitter-UkIkNrek.cjs';
15
+ import '../emitter-D4OcelZ9.cjs';
16
16
  import '../internals/helpers/promise.cjs';
17
17
 
18
18
  /**
@@ -1,4 +1,4 @@
1
- import { JSONToolOutput, Tool, ToolEmitter, ToolInput, BaseToolRunOptions } from './base.js';
1
+ import { Tool, JSONToolOutput, ToolEmitter, ToolInput, BaseToolRunOptions } from './base.js';
2
2
  import { GetRunContext } from '../context.js';
3
3
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
4
  import { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
@@ -12,7 +12,7 @@ import '../cache/base.js';
12
12
  import '../internals/helpers/schema.js';
13
13
  import 'zod';
14
14
  import 'zod-to-json-schema';
15
- import '../emitter-CL56qab4.js';
15
+ import '../emitter-kHxkUxco.js';
16
16
  import '../internals/helpers/promise.js';
17
17
 
18
18
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tools/mcp.ts"],"names":["MCPToolOutput","JSONToolOutput","MCPTool","Tool","name","description","emitter","client","tool","options","Emitter","root","child","namespace","toCamelCase","creator","inputSchema","_run","input","_options","run","result","callTool","arguments","undefined","signal","fromClient","tools","paginate","size","Infinity","handler","cursor","nextCursor","listTools","data","map"],"mappings":";;;;;;;AAmBO,MAAMA,sBAAsBC,cAAAA,CAAAA;EAnBnC;;;AAmBwD;AAEjD,MAAMC,gBAAgBC,IAAAA,CAAAA;EArB7B;;;AAsBkBC,EAAAA,IAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,OAAAA;AAEAC,EAAAA,MAAAA;AACCC,EAAAA,IAAAA;AAEjB,EAAA,WAAA,CAAmB,EAAED,MAAAA,EAAQC,IAAAA,EAAM,GAAGC,SAAAA,EAAyB;AAC7D,IAAA,KAAA,CAAMA,OAAAA,CAAAA;AACN,IAAA,IAAA,CAAKF,MAAAA,GAASA,MAAAA;AACd,IAAA,IAAA,CAAKC,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKJ,OAAOI,IAAAA,CAAKJ,IAAAA;AACjB,IAAA,IAAA,CAAKC,WAAAA,GACHG,KAAKH,WAAAA,IAAe,sEAAA;AACtB,IAAA,IAAA,CAAKC,OAAAA,GAAUI,OAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAAM;MAChCC,SAAAA,EAAW;AAAC,QAAA,MAAA;AAAQ,QAAA,KAAA;AAAOC,QAAAA,WAAAA,CAAY,KAAKV,IAAI;;MAChDW,OAAAA,EAAS;KACX,CAAA;AACF;EAEOC,WAAAA,GAAc;AACnB,IAAA,OAAO,KAAKR,IAAAA,CAAKQ,WAAAA;AACnB;EAEA,MAAgBC,IAAAA,CACdC,KAAAA,EACAC,QAAAA,EACAC,GAAAA,EACA;AACA,IAAA,MAAMC,MAAAA,GAAS,MAAM,IAAA,CAAKd,MAAAA,CAAOe,QAAAA,CAAS;AAAElB,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;MAAMmB,SAAAA,EAAWL;AAAM,KAAA,EAAGM,MAAAA,EAAW;AAC1FC,MAAAA,MAAAA,EAAQL,GAAAA,CAAIK;KACd,CAAA;AACA,IAAA,OAAO,IAAIzB,cAAcqB,MAAAA,CAAAA;AAC3B;AAEA,EAAA,aAAoBK,WAAWnB,MAAAA,EAAuC;AACpE,IAAA,MAAMoB,KAAAA,GAAQ,MAAMC,QAAAA,CAAS;MAC3BC,IAAAA,EAAMC,QAAAA;MACNC,OAAAA,kBAAS,MAAA,CAAA,OAAO,EAAEC,MAAAA,EAAM,KAAuB;AAC7C,QAAA,MAAM,EAAEL,KAAAA,EAAAA,MAAAA,EAAOM,YAAU,GAAK,MAAM1B,OAAO2B,SAAAA,CAAU;AAAEF,UAAAA;SAAO,CAAA;AAC9D,QAAA,OAAO;UAAEG,IAAAA,EAAMR,MAAAA;AAAOM,UAAAA;AAAW,SAAA;OACnC,EAHS,SAAA;KAIX,CAAA;AACA,IAAA,OAAON,KAAAA,CAAMS,GAAAA,CAAI,CAAC5B,IAAAA,KAAS,IAAIN,OAAAA,CAAQ;AAAEK,MAAAA,MAAAA;AAAQC,MAAAA;AAAK,KAAA,CAAA,CAAA;AACxD;AACF","file":"mcp.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseToolRunOptions, ToolEmitter, ToolInput, JSONToolOutput, Tool } from \"@/tools/base.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { Client as MCPClient } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { ListToolsResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { SchemaObject } from \"ajv\";\nimport { paginate } from \"@/internals/helpers/paginate.js\";\nimport { toCamelCase } from \"remeda\";\n\nexport interface MCPToolInput {\n client: MCPClient;\n tool: ListToolsResult[\"tools\"][number];\n}\n\nexport class MCPToolOutput extends JSONToolOutput<any> {}\n\nexport class MCPTool extends Tool<MCPToolOutput> {\n public readonly name: string;\n public readonly description: string;\n public readonly emitter: ToolEmitter<ToolInput<this>, MCPToolOutput>;\n\n public readonly client: MCPClient;\n private readonly tool: ListToolsResult[\"tools\"][number];\n\n public constructor({ client, tool, ...options }: MCPToolInput) {\n super(options);\n this.client = client;\n this.tool = tool;\n this.name = tool.name;\n this.description =\n tool.description ?? \"No available description, use the tool based on its name and schema.\";\n this.emitter = Emitter.root.child({\n namespace: [\"tool\", \"mcp\", toCamelCase(this.name)],\n creator: this,\n });\n }\n\n public inputSchema() {\n return this.tool.inputSchema as SchemaObject;\n }\n\n protected async _run(\n input: ToolInput<this>,\n _options: BaseToolRunOptions,\n run: GetRunContext<typeof this>,\n ) {\n const result = await this.client.callTool({ name: this.name, arguments: input }, undefined, {\n signal: run.signal,\n });\n return new MCPToolOutput(result);\n }\n\n public static async fromClient(client: MCPClient): Promise<MCPTool[]> {\n const tools = await paginate({\n size: Infinity,\n handler: async ({ cursor }: { cursor?: string }) => {\n const { tools, nextCursor } = await client.listTools({ cursor });\n return { data: tools, nextCursor } as const;\n },\n });\n return tools.map((tool) => new MCPTool({ client, tool }));\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/tools/mcp.ts"],"names":["MCPToolOutput","JSONToolOutput","MCPTool","Tool","name","description","emitter","client","tool","options","Emitter","root","child","namespace","toCamelCase","creator","inputSchema","_run","input","_options","run","result","callTool","arguments","undefined","signal","fromClient","tools","paginate","size","Infinity","handler","cursor","nextCursor","listTools","data","map"],"mappings":";;;;;;;AAmBO,MAAMA,sBAAsBC,cAAAA,CAAAA;EAnBnC;;;AAmBwD;AAEjD,MAAMC,gBAAgBC,IAAAA,CAAAA;EArB7B;;;AAsBkBC,EAAAA,IAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,OAAAA;AAEAC,EAAAA,MAAAA;AACCC,EAAAA,IAAAA;AAEjB,EAAA,WAAA,CAAmB,EAAED,MAAAA,EAAQC,IAAAA,EAAM,GAAGC,SAAAA,EAAyB;AAC7D,IAAA,KAAA,CAAMA,OAAAA,CAAAA;AACN,IAAA,IAAA,CAAKF,MAAAA,GAASA,MAAAA;AACd,IAAA,IAAA,CAAKC,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKJ,OAAOI,IAAAA,CAAKJ,IAAAA;AACjB,IAAA,IAAA,CAAKC,WAAAA,GACHG,KAAKH,WAAAA,IAAe,sEAAA;AACtB,IAAA,IAAA,CAAKC,OAAAA,GAAUI,OAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAAM;MAChCC,SAAAA,EAAW;AAAC,QAAA,MAAA;AAAQ,QAAA,KAAA;AAAOC,QAAAA,WAAAA,CAAY,KAAKV,IAAI;;MAChDW,OAAAA,EAAS;KACX,CAAA;AACF,EAAA;EAEOC,WAAAA,GAAc;AACnB,IAAA,OAAO,KAAKR,IAAAA,CAAKQ,WAAAA;AACnB,EAAA;EAEA,MAAgBC,IAAAA,CACdC,KAAAA,EACAC,QAAAA,EACAC,GAAAA,EACA;AACA,IAAA,MAAMC,MAAAA,GAAS,MAAM,IAAA,CAAKd,MAAAA,CAAOe,QAAAA,CAAS;AAAElB,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;MAAMmB,SAAAA,EAAWL;AAAM,KAAA,EAAGM,MAAAA,EAAW;AAC1FC,MAAAA,MAAAA,EAAQL,GAAAA,CAAIK;KACd,CAAA;AACA,IAAA,OAAO,IAAIzB,cAAcqB,MAAAA,CAAAA;AAC3B,EAAA;AAEA,EAAA,aAAoBK,WAAWnB,MAAAA,EAAuC;AACpE,IAAA,MAAMoB,KAAAA,GAAQ,MAAMC,QAAAA,CAAS;MAC3BC,IAAAA,EAAMC,QAAAA;MACNC,OAAAA,kBAAS,MAAA,CAAA,OAAO,EAAEC,MAAAA,EAAM,KAAuB;AAC7C,QAAA,MAAM,EAAEL,KAAAA,EAAAA,MAAAA,EAAOM,YAAU,GAAK,MAAM1B,OAAO2B,SAAAA,CAAU;AAAEF,UAAAA;SAAO,CAAA;AAC9D,QAAA,OAAO;UAAEG,IAAAA,EAAMR,MAAAA;AAAOM,UAAAA;AAAW,SAAA;MACnC,CAAA,EAHS,SAAA;KAIX,CAAA;AACA,IAAA,OAAON,KAAAA,CAAMS,GAAAA,CAAI,CAAC5B,IAAAA,KAAS,IAAIN,OAAAA,CAAQ;AAAEK,MAAAA,MAAAA;AAAQC,MAAAA;AAAK,KAAA,CAAA,CAAA;AACxD,EAAA;AACF","file":"mcp.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseToolRunOptions, ToolEmitter, ToolInput, JSONToolOutput, Tool } from \"@/tools/base.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { Client as MCPClient } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { ListToolsResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { SchemaObject } from \"ajv\";\nimport { paginate } from \"@/internals/helpers/paginate.js\";\nimport { toCamelCase } from \"remeda\";\n\nexport interface MCPToolInput {\n client: MCPClient;\n tool: ListToolsResult[\"tools\"][number];\n}\n\nexport class MCPToolOutput extends JSONToolOutput<any> {}\n\nexport class MCPTool extends Tool<MCPToolOutput> {\n public readonly name: string;\n public readonly description: string;\n public readonly emitter: ToolEmitter<ToolInput<this>, MCPToolOutput>;\n\n public readonly client: MCPClient;\n private readonly tool: ListToolsResult[\"tools\"][number];\n\n public constructor({ client, tool, ...options }: MCPToolInput) {\n super(options);\n this.client = client;\n this.tool = tool;\n this.name = tool.name;\n this.description =\n tool.description ?? \"No available description, use the tool based on its name and schema.\";\n this.emitter = Emitter.root.child({\n namespace: [\"tool\", \"mcp\", toCamelCase(this.name)],\n creator: this,\n });\n }\n\n public inputSchema() {\n return this.tool.inputSchema as SchemaObject;\n }\n\n protected async _run(\n input: ToolInput<this>,\n _options: BaseToolRunOptions,\n run: GetRunContext<typeof this>,\n ) {\n const result = await this.client.callTool({ name: this.name, arguments: input }, undefined, {\n signal: run.signal,\n });\n return new MCPToolOutput(result);\n }\n\n public static async fromClient(client: MCPClient): Promise<MCPTool[]> {\n const tools = await paginate({\n size: Infinity,\n handler: async ({ cursor }: { cursor?: string }) => {\n const { tools, nextCursor } = await client.listTools({ cursor });\n return { data: tools, nextCursor } as const;\n },\n });\n return tools.map((tool) => new MCPTool({ client, tool }));\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tools/openapi.ts"],"names":["OpenAPIToolOutput","StringToolOutput","status","statusText","result","OpenAPITool","Tool","name","description","url","openApiSchema","inputSchema","getReferencedObject","json","refPath","pathSegments","split","currentObject","segment","type","required","oneOf","Object","entries","paths","flatMap","path","pathSpec","map","method","methodSpec","additionalProperties","properties","const","summary","requestBody","content","schema","body","parameters","filter","p","reduce","acc","$ref","emitter","register","options","parse","servers","find","s","ValueError","info","title","trim","Emitter","root","child","namespace","toCamelCase","creator","_run","input","_options","run","URL","keys","forEach","key","value","newPath","replace","searchParams","append","pathname","join","fetchOptions","signal","AbortSignal","any","isTruthy","isEmpty","undefined","toLowerCase","headers","Accept","emit","response","fetch","toString","text","output","data","err","ToolError","createSnapshot","clone"],"mappings":"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","file":"openapi.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { join } from \"path\";\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n StringToolOutput,\n Tool,\n ToolError,\n ToolEmitter,\n} from \"@/tools/base.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { ValueError } from \"@/errors.js\";\nimport { SchemaObject } from \"ajv\";\nimport { parse } from \"yaml\";\nimport { isEmpty, isTruthy, clone, toCamelCase } from \"remeda\";\n\nexport interface OpenAPIToolOptions extends BaseToolOptions {\n name?: string;\n description?: string;\n openApiSchema: any;\n url?: string;\n fetchOptions?: RequestInit;\n}\n\nexport interface OpenAPIEvents {\n beforeFetch: Callback<{ options: RequestInit; url: URL }>;\n afterFetch: Callback<{ data: OpenAPIToolOutput; url: URL }>;\n}\n\nexport class OpenAPIToolOutput extends StringToolOutput {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly result = \"\",\n ) {\n super();\n this.status = status;\n this.statusText = statusText;\n this.result = result ?? \"\";\n }\n}\n\nexport class OpenAPITool extends Tool<OpenAPIToolOutput, OpenAPIToolOptions> {\n public readonly name: string;\n public readonly description: string;\n public readonly url: string;\n\n public readonly openApiSchema: any;\n\n inputSchema(): SchemaObject {\n const getReferencedObject = (json: any, refPath: string) => {\n const pathSegments = refPath.split(\"/\");\n let currentObject = json;\n for (const segment of pathSegments) {\n if (segment === \"#\") {\n continue;\n }\n currentObject = currentObject[segment];\n }\n return currentObject;\n };\n\n return {\n type: \"object\",\n required: [\"path\", \"method\"],\n oneOf: Object.entries(this.openApiSchema.paths).flatMap(([path, pathSpec]: [string, any]) =>\n Object.entries(pathSpec).map(([method, methodSpec]: [string, any]) => ({\n additionalProperties: false,\n properties: {\n path: {\n const: path,\n description:\n \"Do not replace variables in path, instead of, put them to the parameters object.\",\n },\n method: { const: method, description: methodSpec.summary || methodSpec.description },\n ...(methodSpec.requestBody?.content?.[\"application/json\"]?.schema\n ? {\n body: methodSpec.requestBody?.content?.[\"application/json\"]?.schema,\n }\n : {}),\n ...(methodSpec.parameters\n ? {\n parameters: {\n type: \"object\",\n additionalProperties: false,\n required: methodSpec.parameters\n .filter((p: any) => p.required === true)\n .map((p: any) => p.name),\n properties: methodSpec.parameters.reduce(\n (acc: any, p: any) =>\n !p.$ref\n ? { ...acc, [p.name]: { ...p.schema, description: p.name } }\n : {\n ...acc,\n [getReferencedObject(this.openApiSchema, p.$ref)?.name]: {\n ...getReferencedObject(this.openApiSchema, p.$ref)?.schema,\n description: getReferencedObject(this.openApiSchema, p.$ref)?.name,\n },\n },\n {},\n ),\n },\n }\n : {}),\n },\n })),\n ),\n } as const satisfies SchemaObject;\n }\n\n public readonly emitter: ToolEmitter<Record<string, any>, OpenAPIToolOutput, OpenAPIEvents>;\n\n static {\n this.register();\n }\n\n public constructor(options: OpenAPIToolOptions) {\n super(options);\n\n this.openApiSchema = parse(options.openApiSchema);\n\n this.url = this.options.url || this.openApiSchema.servers?.find((s: any) => s?.url)?.url;\n if (!this.url) {\n throw new ValueError(\n \"OpenAPI schema hasn't any server with url specified. Pass it manually.\",\n );\n }\n\n this.name = options.name ?? this.openApiSchema?.info?.title?.trim();\n if (!this.name) {\n throw new ValueError(\"OpenAPI schema hasn't 'name' specified. Pass it manually.\");\n }\n this.emitter = Emitter.root.child({\n namespace: [\"tool\", \"web\", \"openAPI\", toCamelCase(this.name)],\n creator: this,\n });\n\n this.description =\n options.description ||\n this.openApiSchema?.info?.description ||\n \"Performs REST API requests to the servers and retrieves the response. The server API interfaces are defined in OpenAPI schema. \\n\" +\n \"Only use the OpenAPI tool if you need to communicate to external servers.\";\n\n if (!this.description) {\n throw new ValueError(\"OpenAPI schema hasn't 'description' specified. Pass it manually.\");\n }\n }\n\n protected async _run(\n input: Record<string, any>,\n _options: Partial<BaseToolRunOptions>,\n run: GetRunContext<typeof this>,\n ) {\n let path: string = input.path || \"\";\n const url = new URL(this.url);\n Object.keys(input.parameters ?? {}).forEach((key) => {\n const value = input.parameters[key];\n const newPath = path.replace(`{${key}}`, value);\n if (newPath == path) {\n url.searchParams.append(key, value);\n } else {\n path = newPath;\n }\n });\n url.pathname = join(url.pathname, path);\n const options: RequestInit = {\n ...this.options.fetchOptions,\n signal: AbortSignal.any([run.signal, this.options.fetchOptions?.signal].filter(isTruthy)),\n body: !isEmpty(input.body) ? input.body : undefined,\n method: input.method.toLowerCase(),\n headers: { Accept: \"application/json\", ...this.options.fetchOptions?.headers },\n };\n await run.emitter.emit(\"beforeFetch\", { options: options, url: url });\n try {\n const response = await fetch(url.toString(), options);\n const text = await response.text();\n const output = new OpenAPIToolOutput(response.status, response.statusText, text);\n await run.emitter.emit(\"afterFetch\", { data: output, url });\n return output;\n } catch (err) {\n throw new ToolError(`Request to ${url} has failed.`, [err]);\n }\n }\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n openApiSchema: clone(this.openApiSchema),\n name: this.name,\n description: this.description,\n url: this.url,\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/tools/openapi.ts"],"names":["OpenAPIToolOutput","StringToolOutput","status","statusText","result","OpenAPITool","Tool","name","description","url","openApiSchema","inputSchema","getReferencedObject","json","refPath","pathSegments","split","currentObject","segment","type","required","oneOf","Object","entries","paths","flatMap","path","pathSpec","map","method","methodSpec","additionalProperties","properties","const","summary","requestBody","content","schema","body","parameters","filter","p","reduce","acc","$ref","emitter","register","options","parse","servers","find","s","ValueError","info","title","trim","Emitter","root","child","namespace","toCamelCase","creator","_run","input","_options","run","URL","keys","forEach","key","value","newPath","replace","searchParams","append","pathname","join","fetchOptions","signal","AbortSignal","any","isTruthy","isEmpty","undefined","toLowerCase","headers","Accept","emit","response","fetch","toString","text","output","data","err","ToolError","createSnapshot","clone"],"mappings":"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","file":"openapi.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { join } from \"path\";\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n StringToolOutput,\n Tool,\n ToolError,\n ToolEmitter,\n} from \"@/tools/base.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { ValueError } from \"@/errors.js\";\nimport { SchemaObject } from \"ajv\";\nimport { parse } from \"yaml\";\nimport { isEmpty, isTruthy, clone, toCamelCase } from \"remeda\";\n\nexport interface OpenAPIToolOptions extends BaseToolOptions {\n name?: string;\n description?: string;\n openApiSchema: any;\n url?: string;\n fetchOptions?: RequestInit;\n}\n\nexport interface OpenAPIEvents {\n beforeFetch: Callback<{ options: RequestInit; url: URL }>;\n afterFetch: Callback<{ data: OpenAPIToolOutput; url: URL }>;\n}\n\nexport class OpenAPIToolOutput extends StringToolOutput {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly result = \"\",\n ) {\n super();\n this.status = status;\n this.statusText = statusText;\n this.result = result ?? \"\";\n }\n}\n\nexport class OpenAPITool extends Tool<OpenAPIToolOutput, OpenAPIToolOptions> {\n public readonly name: string;\n public readonly description: string;\n public readonly url: string;\n\n public readonly openApiSchema: any;\n\n inputSchema(): SchemaObject {\n const getReferencedObject = (json: any, refPath: string) => {\n const pathSegments = refPath.split(\"/\");\n let currentObject = json;\n for (const segment of pathSegments) {\n if (segment === \"#\") {\n continue;\n }\n currentObject = currentObject[segment];\n }\n return currentObject;\n };\n\n return {\n type: \"object\",\n required: [\"path\", \"method\"],\n oneOf: Object.entries(this.openApiSchema.paths).flatMap(([path, pathSpec]: [string, any]) =>\n Object.entries(pathSpec).map(([method, methodSpec]: [string, any]) => ({\n additionalProperties: false,\n properties: {\n path: {\n const: path,\n description:\n \"Do not replace variables in path, instead of, put them to the parameters object.\",\n },\n method: { const: method, description: methodSpec.summary || methodSpec.description },\n ...(methodSpec.requestBody?.content?.[\"application/json\"]?.schema\n ? {\n body: methodSpec.requestBody?.content?.[\"application/json\"]?.schema,\n }\n : {}),\n ...(methodSpec.parameters\n ? {\n parameters: {\n type: \"object\",\n additionalProperties: false,\n required: methodSpec.parameters\n .filter((p: any) => p.required === true)\n .map((p: any) => p.name),\n properties: methodSpec.parameters.reduce(\n (acc: any, p: any) =>\n !p.$ref\n ? { ...acc, [p.name]: { ...p.schema, description: p.name } }\n : {\n ...acc,\n [getReferencedObject(this.openApiSchema, p.$ref)?.name]: {\n ...getReferencedObject(this.openApiSchema, p.$ref)?.schema,\n description: getReferencedObject(this.openApiSchema, p.$ref)?.name,\n },\n },\n {},\n ),\n },\n }\n : {}),\n },\n })),\n ),\n } as const satisfies SchemaObject;\n }\n\n public readonly emitter: ToolEmitter<Record<string, any>, OpenAPIToolOutput, OpenAPIEvents>;\n\n static {\n this.register();\n }\n\n public constructor(options: OpenAPIToolOptions) {\n super(options);\n\n this.openApiSchema = parse(options.openApiSchema);\n\n this.url = this.options.url || this.openApiSchema.servers?.find((s: any) => s?.url)?.url;\n if (!this.url) {\n throw new ValueError(\n \"OpenAPI schema hasn't any server with url specified. Pass it manually.\",\n );\n }\n\n this.name = options.name ?? this.openApiSchema?.info?.title?.trim();\n if (!this.name) {\n throw new ValueError(\"OpenAPI schema hasn't 'name' specified. Pass it manually.\");\n }\n this.emitter = Emitter.root.child({\n namespace: [\"tool\", \"web\", \"openAPI\", toCamelCase(this.name)],\n creator: this,\n });\n\n this.description =\n options.description ||\n this.openApiSchema?.info?.description ||\n \"Performs REST API requests to the servers and retrieves the response. The server API interfaces are defined in OpenAPI schema. \\n\" +\n \"Only use the OpenAPI tool if you need to communicate to external servers.\";\n\n if (!this.description) {\n throw new ValueError(\"OpenAPI schema hasn't 'description' specified. Pass it manually.\");\n }\n }\n\n protected async _run(\n input: Record<string, any>,\n _options: Partial<BaseToolRunOptions>,\n run: GetRunContext<typeof this>,\n ) {\n let path: string = input.path || \"\";\n const url = new URL(this.url);\n Object.keys(input.parameters ?? {}).forEach((key) => {\n const value = input.parameters[key];\n const newPath = path.replace(`{${key}}`, value);\n if (newPath == path) {\n url.searchParams.append(key, value);\n } else {\n path = newPath;\n }\n });\n url.pathname = join(url.pathname, path);\n const options: RequestInit = {\n ...this.options.fetchOptions,\n signal: AbortSignal.any([run.signal, this.options.fetchOptions?.signal].filter(isTruthy)),\n body: !isEmpty(input.body) ? input.body : undefined,\n method: input.method.toLowerCase(),\n headers: { Accept: \"application/json\", ...this.options.fetchOptions?.headers },\n };\n await run.emitter.emit(\"beforeFetch\", { options: options, url: url });\n try {\n const response = await fetch(url.toString(), options);\n const text = await response.text();\n const output = new OpenAPIToolOutput(response.status, response.statusText, text);\n await run.emitter.emit(\"afterFetch\", { data: output, url });\n return output;\n } catch (err) {\n throw new ToolError(`Request to ${url} has failed.`, [err]);\n }\n }\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n openApiSchema: clone(this.openApiSchema),\n name: this.name,\n description: this.description,\n url: this.url,\n };\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { BaseCache } from '../cache/base.cjs';
2
2
  import * as promise_based_task from 'promise-based-task';
3
- import { BaseToolOptions, StringToolOutput, Tool, ToolEmitter, BaseToolRunOptions } from './base.cjs';
4
- import { C as Callback, E as Emitter } from '../emitter-UkIkNrek.cjs';
3
+ import { StringToolOutput, Tool, BaseToolOptions, ToolEmitter, BaseToolRunOptions } from './base.cjs';
4
+ import { C as Callback, E as Emitter } from '../emitter-D4OcelZ9.cjs';
5
5
  import { GetRunContext } from '../context.cjs';
6
6
  import { SchemaObject } from 'ajv';
7
7
  import '../internals/serializable.cjs';
@@ -1,7 +1,7 @@
1
1
  import { BaseCache } from '../cache/base.js';
2
2
  import * as promise_based_task from 'promise-based-task';
3
- import { BaseToolOptions, StringToolOutput, Tool, ToolEmitter, BaseToolRunOptions } from './base.js';
4
- import { C as Callback, E as Emitter } from '../emitter-CL56qab4.js';
3
+ import { StringToolOutput, Tool, BaseToolOptions, ToolEmitter, BaseToolRunOptions } from './base.js';
4
+ import { C as Callback, E as Emitter } from '../emitter-kHxkUxco.js';
5
5
  import { GetRunContext } from '../context.js';
6
6
  import { SchemaObject } from 'ajv';
7
7
  import '../internals/serializable.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tools/openapi.ts"],"names":["OpenAPIToolOutput","StringToolOutput","status","statusText","result","OpenAPITool","Tool","name","description","url","openApiSchema","inputSchema","getReferencedObject","json","refPath","pathSegments","split","currentObject","segment","type","required","oneOf","Object","entries","paths","flatMap","path","pathSpec","map","method","methodSpec","additionalProperties","properties","const","summary","requestBody","content","schema","body","parameters","filter","p","reduce","acc","$ref","emitter","register","options","parse","servers","find","s","ValueError","info","title","trim","Emitter","root","child","namespace","toCamelCase","creator","_run","input","_options","run","URL","keys","forEach","key","value","newPath","replace","searchParams","append","pathname","join","fetchOptions","signal","AbortSignal","any","isTruthy","isEmpty","undefined","toLowerCase","headers","Accept","emit","response","fetch","toString","text","output","data","err","ToolError","createSnapshot","clone"],"mappings":";;;;;;;;;AAmCO,MAAMA,0BAA0BC,gBAAAA,CAAAA;EAnCvC;;;;;;EAoCE,WAAA,CACkBC,MAAAA,EACAC,UAAAA,EACAC,MAAAA,GAAS,EAAA,EACzB;AACA,IAAA,KAAA,EAAK,EAAA,KAJWF,MAAAA,GAAAA,MAAAA,EAAAA,KACAC,UAAAA,GAAAA,UAAAA,EAAAA,KACAC,MAAAA,GAAAA,MAAAA;AAGhB,IAAA,IAAA,CAAKF,MAAAA,GAASA,MAAAA;AACd,IAAA,IAAA,CAAKC,UAAAA,GAAaA,UAAAA;AAClB,IAAA,IAAA,CAAKC,SAASA,MAAAA,IAAU,EAAA;AAC1B;AACF;AAEO,MAAMC,oBAAoBC,IAAAA,CAAAA;EAhDjC;;;AAiDkBC,EAAAA,IAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,GAAAA;AAEAC,EAAAA,aAAAA;EAEhBC,WAAAA,GAA4B;AAC1B,IAAA,MAAMC,mBAAAA,mBAAsB,MAAA,CAAA,CAACC,IAAAA,EAAWC,OAAAA,KAAAA;AACtC,MAAA,MAAMC,YAAAA,GAAeD,OAAAA,CAAQE,KAAAA,CAAM,GAAA,CAAA;AACnC,MAAA,IAAIC,aAAAA,GAAgBJ,IAAAA;AACpB,MAAA,KAAA,MAAWK,WAAWH,YAAAA,EAAc;AAClC,QAAA,IAAIG,YAAY,GAAA,EAAK;AACnB,UAAA;AACF;AACAD,QAAAA,aAAAA,GAAgBA,cAAcC,OAAAA,CAAAA;AAChC;AACA,MAAA,OAAOD,aAAAA;KACT,EAV4B,qBAAA,CAAA;AAY5B,IAAA,OAAO;MACLE,IAAAA,EAAM,QAAA;MACNC,QAAAA,EAAU;AAAC,QAAA,MAAA;AAAQ,QAAA;;MACnBC,KAAAA,EAAOC,MAAAA,CAAOC,QAAQ,IAAA,CAAKb,aAAAA,CAAcc,KAAK,CAAA,CAAEC,OAAAA,CAAQ,CAAC,CAACC,IAAAA,EAAMC,QAAAA,CAAAA,KAC9DL,MAAAA,CAAOC,QAAQI,QAAAA,CAAAA,CAAUC,IAAI,CAAC,CAACC,MAAAA,EAAQC,UAAAA,CAAAA,MAAgC;QACrEC,oBAAAA,EAAsB,KAAA;QACtBC,UAAAA,EAAY;UACVN,IAAAA,EAAM;YACJO,KAAAA,EAAOP,IAAAA;YACPlB,WAAAA,EACE;AACJ,WAAA;UACAqB,MAAAA,EAAQ;YAAEI,KAAAA,EAAOJ,MAAAA;YAAQrB,WAAAA,EAAasB,UAAAA,CAAWI,WAAWJ,UAAAA,CAAWtB;AAAY,WAAA;AACnF,UAAA,GAAIsB,UAAAA,CAAWK,WAAAA,EAAaC,OAAAA,GAAU,kBAAA,GAAqBC,MAAAA,GACvD;AACEC,YAAAA,IAAAA,EAAMR,UAAAA,CAAWK,WAAAA,EAAaC,OAAAA,GAAU,kBAAA,CAAA,EAAqBC;AAC/D,WAAA,GACA,EAAC;AACL,UAAA,GAAIP,WAAWS,UAAAA,GACX;YACEA,UAAAA,EAAY;cACVpB,IAAAA,EAAM,QAAA;cACNY,oBAAAA,EAAsB,KAAA;AACtBX,cAAAA,QAAAA,EAAUU,UAAAA,CAAWS,UAAAA,CAClBC,MAAAA,CAAO,CAACC,CAAAA,KAAWA,CAAAA,CAAErB,QAAAA,KAAa,IAAA,CAAA,CAClCQ,GAAAA,CAAI,CAACa,CAAAA,KAAWA,EAAElC,IAAI,CAAA;cACzByB,UAAAA,EAAYF,UAAAA,CAAWS,WAAWG,MAAAA,CAChC,CAACC,KAAUF,CAAAA,KACT,CAACA,EAAEG,IAAAA,GACC;gBAAE,GAAGD,GAAAA;gBAAK,CAACF,CAAAA,CAAElC,IAAI,GAAG;AAAE,kBAAA,GAAGkC,CAAAA,CAAEJ,MAAAA;AAAQ7B,kBAAAA,WAAAA,EAAaiC,CAAAA,CAAElC;AAAK;eAAE,GACzD;gBACE,GAAGoC,GAAAA;AACH,gBAAA,CAAC/B,oBAAoB,IAAA,CAAKF,aAAAA,EAAe+B,EAAEG,IAAI,CAAA,EAAGrC,IAAAA,GAAO;AACvD,kBAAA,GAAGK,mBAAAA,CAAoB,IAAA,CAAKF,aAAAA,EAAe+B,CAAAA,CAAEG,IAAI,CAAA,EAAGP,MAAAA;AACpD7B,kBAAAA,WAAAA,EAAaI,mBAAAA,CAAoB,IAAA,CAAKF,aAAAA,EAAe+B,CAAAA,CAAEG,IAAI,CAAA,EAAGrC;AAChE;AACF,eAAA,EACN,EAAC;AAEL;AACF,WAAA,GACA;AACN;AACF,OAAA,CAAA,CAAA;AAEJ,KAAA;AACF;AAEgBsC,EAAAA,OAAAA;EAEhB;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;AAEA,EAAA,WAAA,CAAmBC,OAAAA,EAA6B;AAC9C,IAAA,KAAA,CAAMA,OAAAA,CAAAA;AAEN,IAAA,IAAA,CAAKrC,aAAAA,GAAgBsC,KAAAA,CAAMD,OAAAA,CAAQrC,aAAa,CAAA;AAEhD,IAAA,IAAA,CAAKD,GAAAA,GAAM,IAAA,CAAKsC,OAAAA,CAAQtC,GAAAA,IAAO,IAAA,CAAKC,aAAAA,CAAcuC,OAAAA,EAASC,IAAAA,CAAK,CAACC,CAAAA,KAAWA,CAAAA,EAAG1C,GAAAA,CAAAA,EAAMA,GAAAA;AACrF,IAAA,IAAI,CAAC,KAAKA,GAAAA,EAAK;AACb,MAAA,MAAM,IAAI2C,WACR,wEAAA,CAAA;AAEJ;AAEA,IAAA,IAAA,CAAK7C,OAAOwC,OAAAA,CAAQxC,IAAAA,IAAQ,KAAKG,aAAAA,EAAe2C,IAAAA,EAAMC,OAAOC,IAAAA,EAAAA;AAC7D,IAAA,IAAI,CAAC,KAAKhD,IAAAA,EAAM;AACd,MAAA,MAAM,IAAI6C,WAAW,2DAAA,CAAA;AACvB;AACA,IAAA,IAAA,CAAKP,OAAAA,GAAUW,OAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAAM;MAChCC,SAAAA,EAAW;AAAC,QAAA,MAAA;AAAQ,QAAA,KAAA;AAAO,QAAA,SAAA;AAAWC,QAAAA,WAAAA,CAAY,KAAKrD,IAAI;;MAC3DsD,OAAAA,EAAS;KACX,CAAA;AAEA,IAAA,IAAA,CAAKrD,cACHuC,OAAAA,CAAQvC,WAAAA,IACR,IAAA,CAAKE,aAAAA,EAAe2C,MAAM7C,WAAAA,IAC1B,4MAAA;AAGF,IAAA,IAAI,CAAC,KAAKA,WAAAA,EAAa;AACrB,MAAA,MAAM,IAAI4C,WAAW,kEAAA,CAAA;AACvB;AACF;EAEA,MAAgBU,IAAAA,CACdC,KAAAA,EACAC,QAAAA,EACAC,GAAAA,EACA;AACA,IAAA,IAAIvC,IAAAA,GAAeqC,MAAMrC,IAAAA,IAAQ,EAAA;AACjC,IAAA,MAAMjB,GAAAA,GAAM,IAAIyD,GAAAA,CAAI,IAAA,CAAKzD,GAAG,CAAA;AAC5Ba,IAAAA,MAAAA,CAAO6C,IAAAA,CAAKJ,MAAMxB,UAAAA,IAAc,EAAC,CAAA,CAAG6B,OAAAA,CAAQ,CAACC,GAAAA,KAAAA;AAC3C,MAAA,MAAMC,KAAAA,GAAQP,KAAAA,CAAMxB,UAAAA,CAAW8B,GAAAA,CAAAA;AAC/B,MAAA,MAAME,UAAU7C,IAAAA,CAAK8C,OAAAA,CAAQ,CAAA,CAAA,EAAIH,GAAAA,KAAQC,KAAAA,CAAAA;AACzC,MAAA,IAAIC,WAAW7C,IAAAA,EAAM;AACnBjB,QAAAA,GAAAA,CAAIgE,YAAAA,CAAaC,MAAAA,CAAOL,GAAAA,EAAKC,KAAAA,CAAAA;OAC/B,MAAO;AACL5C,QAAAA,IAAAA,GAAO6C,OAAAA;AACT;KACF,CAAA;AACA9D,IAAAA,GAAAA,CAAIkE,QAAAA,GAAWC,IAAAA,CAAKnE,GAAAA,CAAIkE,QAAAA,EAAUjD,IAAAA,CAAAA;AAClC,IAAA,MAAMqB,OAAAA,GAAuB;AAC3B,MAAA,GAAG,KAAKA,OAAAA,CAAQ8B,YAAAA;AAChBC,MAAAA,MAAAA,EAAQC,YAAYC,GAAAA,CAAI;QAACf,GAAAA,CAAIa,MAAAA;AAAQ,QAAA,IAAA,CAAK/B,QAAQ8B,YAAAA,EAAcC;AAAQtC,OAAAA,CAAAA,MAAAA,CAAOyC,QAAAA,CAAAA,CAAAA;AAC/E3C,MAAAA,IAAAA,EAAM,CAAC4C,OAAAA,CAAQnB,KAAAA,CAAMzB,IAAI,CAAA,GAAIyB,MAAMzB,IAAAA,GAAO6C,MAAAA;MAC1CtD,MAAAA,EAAQkC,KAAAA,CAAMlC,OAAOuD,WAAAA,EAAW;MAChCC,OAAAA,EAAS;QAAEC,MAAAA,EAAQ,kBAAA;QAAoB,GAAG,IAAA,CAAKvC,QAAQ8B,YAAAA,EAAcQ;AAAQ;AAC/E,KAAA;AACA,IAAA,MAAMpB,GAAAA,CAAIpB,OAAAA,CAAQ0C,IAAAA,CAAK,aAAA,EAAe;AAAExC,MAAAA,OAAAA;AAAkBtC,MAAAA;KAAS,CAAA;AACnE,IAAA,IAAI;AACF,MAAA,MAAM+E,WAAW,MAAMC,KAAAA,CAAMhF,GAAAA,CAAIiF,QAAAA,IAAY3C,OAAAA,CAAAA;AAC7C,MAAA,MAAM4C,IAAAA,GAAO,MAAMH,QAAAA,CAASG,IAAAA,EAAI;AAChC,MAAA,MAAMC,SAAS,IAAI5F,iBAAAA,CAAkBwF,SAAStF,MAAAA,EAAQsF,QAAAA,CAASrF,YAAYwF,IAAAA,CAAAA;AAC3E,MAAA,MAAM1B,GAAAA,CAAIpB,OAAAA,CAAQ0C,IAAAA,CAAK,YAAA,EAAc;QAAEM,IAAAA,EAAMD,MAAAA;AAAQnF,QAAAA;OAAI,CAAA;AACzD,MAAA,OAAOmF,MAAAA;AACT,KAAA,CAAA,OAASE,GAAAA,EAAK;AACZ,MAAA,MAAM,IAAIC,SAAAA,CAAU,CAAA,WAAA,EAActF,GAAAA,CAAAA,YAAAA,CAAAA,EAAmB;AAACqF,QAAAA;AAAI,OAAA,CAAA;AAC5D;AACF;EACAE,cAAAA,GAAiB;AACf,IAAA,OAAO;AACL,MAAA,GAAG,MAAMA,cAAAA,EAAAA;MACTtF,aAAAA,EAAeuF,KAAAA,CAAM,KAAKvF,aAAa,CAAA;AACvCH,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;AAClBC,MAAAA,GAAAA,EAAK,IAAA,CAAKA;AACZ,KAAA;AACF;AACF","file":"openapi.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { join } from \"path\";\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n StringToolOutput,\n Tool,\n ToolError,\n ToolEmitter,\n} from \"@/tools/base.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { ValueError } from \"@/errors.js\";\nimport { SchemaObject } from \"ajv\";\nimport { parse } from \"yaml\";\nimport { isEmpty, isTruthy, clone, toCamelCase } from \"remeda\";\n\nexport interface OpenAPIToolOptions extends BaseToolOptions {\n name?: string;\n description?: string;\n openApiSchema: any;\n url?: string;\n fetchOptions?: RequestInit;\n}\n\nexport interface OpenAPIEvents {\n beforeFetch: Callback<{ options: RequestInit; url: URL }>;\n afterFetch: Callback<{ data: OpenAPIToolOutput; url: URL }>;\n}\n\nexport class OpenAPIToolOutput extends StringToolOutput {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly result = \"\",\n ) {\n super();\n this.status = status;\n this.statusText = statusText;\n this.result = result ?? \"\";\n }\n}\n\nexport class OpenAPITool extends Tool<OpenAPIToolOutput, OpenAPIToolOptions> {\n public readonly name: string;\n public readonly description: string;\n public readonly url: string;\n\n public readonly openApiSchema: any;\n\n inputSchema(): SchemaObject {\n const getReferencedObject = (json: any, refPath: string) => {\n const pathSegments = refPath.split(\"/\");\n let currentObject = json;\n for (const segment of pathSegments) {\n if (segment === \"#\") {\n continue;\n }\n currentObject = currentObject[segment];\n }\n return currentObject;\n };\n\n return {\n type: \"object\",\n required: [\"path\", \"method\"],\n oneOf: Object.entries(this.openApiSchema.paths).flatMap(([path, pathSpec]: [string, any]) =>\n Object.entries(pathSpec).map(([method, methodSpec]: [string, any]) => ({\n additionalProperties: false,\n properties: {\n path: {\n const: path,\n description:\n \"Do not replace variables in path, instead of, put them to the parameters object.\",\n },\n method: { const: method, description: methodSpec.summary || methodSpec.description },\n ...(methodSpec.requestBody?.content?.[\"application/json\"]?.schema\n ? {\n body: methodSpec.requestBody?.content?.[\"application/json\"]?.schema,\n }\n : {}),\n ...(methodSpec.parameters\n ? {\n parameters: {\n type: \"object\",\n additionalProperties: false,\n required: methodSpec.parameters\n .filter((p: any) => p.required === true)\n .map((p: any) => p.name),\n properties: methodSpec.parameters.reduce(\n (acc: any, p: any) =>\n !p.$ref\n ? { ...acc, [p.name]: { ...p.schema, description: p.name } }\n : {\n ...acc,\n [getReferencedObject(this.openApiSchema, p.$ref)?.name]: {\n ...getReferencedObject(this.openApiSchema, p.$ref)?.schema,\n description: getReferencedObject(this.openApiSchema, p.$ref)?.name,\n },\n },\n {},\n ),\n },\n }\n : {}),\n },\n })),\n ),\n } as const satisfies SchemaObject;\n }\n\n public readonly emitter: ToolEmitter<Record<string, any>, OpenAPIToolOutput, OpenAPIEvents>;\n\n static {\n this.register();\n }\n\n public constructor(options: OpenAPIToolOptions) {\n super(options);\n\n this.openApiSchema = parse(options.openApiSchema);\n\n this.url = this.options.url || this.openApiSchema.servers?.find((s: any) => s?.url)?.url;\n if (!this.url) {\n throw new ValueError(\n \"OpenAPI schema hasn't any server with url specified. Pass it manually.\",\n );\n }\n\n this.name = options.name ?? this.openApiSchema?.info?.title?.trim();\n if (!this.name) {\n throw new ValueError(\"OpenAPI schema hasn't 'name' specified. Pass it manually.\");\n }\n this.emitter = Emitter.root.child({\n namespace: [\"tool\", \"web\", \"openAPI\", toCamelCase(this.name)],\n creator: this,\n });\n\n this.description =\n options.description ||\n this.openApiSchema?.info?.description ||\n \"Performs REST API requests to the servers and retrieves the response. The server API interfaces are defined in OpenAPI schema. \\n\" +\n \"Only use the OpenAPI tool if you need to communicate to external servers.\";\n\n if (!this.description) {\n throw new ValueError(\"OpenAPI schema hasn't 'description' specified. Pass it manually.\");\n }\n }\n\n protected async _run(\n input: Record<string, any>,\n _options: Partial<BaseToolRunOptions>,\n run: GetRunContext<typeof this>,\n ) {\n let path: string = input.path || \"\";\n const url = new URL(this.url);\n Object.keys(input.parameters ?? {}).forEach((key) => {\n const value = input.parameters[key];\n const newPath = path.replace(`{${key}}`, value);\n if (newPath == path) {\n url.searchParams.append(key, value);\n } else {\n path = newPath;\n }\n });\n url.pathname = join(url.pathname, path);\n const options: RequestInit = {\n ...this.options.fetchOptions,\n signal: AbortSignal.any([run.signal, this.options.fetchOptions?.signal].filter(isTruthy)),\n body: !isEmpty(input.body) ? input.body : undefined,\n method: input.method.toLowerCase(),\n headers: { Accept: \"application/json\", ...this.options.fetchOptions?.headers },\n };\n await run.emitter.emit(\"beforeFetch\", { options: options, url: url });\n try {\n const response = await fetch(url.toString(), options);\n const text = await response.text();\n const output = new OpenAPIToolOutput(response.status, response.statusText, text);\n await run.emitter.emit(\"afterFetch\", { data: output, url });\n return output;\n } catch (err) {\n throw new ToolError(`Request to ${url} has failed.`, [err]);\n }\n }\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n openApiSchema: clone(this.openApiSchema),\n name: this.name,\n description: this.description,\n url: this.url,\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/tools/openapi.ts"],"names":["OpenAPIToolOutput","StringToolOutput","status","statusText","result","OpenAPITool","Tool","name","description","url","openApiSchema","inputSchema","getReferencedObject","json","refPath","pathSegments","split","currentObject","segment","type","required","oneOf","Object","entries","paths","flatMap","path","pathSpec","map","method","methodSpec","additionalProperties","properties","const","summary","requestBody","content","schema","body","parameters","filter","p","reduce","acc","$ref","emitter","register","options","parse","servers","find","s","ValueError","info","title","trim","Emitter","root","child","namespace","toCamelCase","creator","_run","input","_options","run","URL","keys","forEach","key","value","newPath","replace","searchParams","append","pathname","join","fetchOptions","signal","AbortSignal","any","isTruthy","isEmpty","undefined","toLowerCase","headers","Accept","emit","response","fetch","toString","text","output","data","err","ToolError","createSnapshot","clone"],"mappings":";;;;;;;;;AAmCO,MAAMA,0BAA0BC,gBAAAA,CAAAA;EAnCvC;;;;;;EAoCE,WAAA,CACkBC,MAAAA,EACAC,UAAAA,EACAC,MAAAA,GAAS,EAAA,EACzB;AACA,IAAA,KAAA,EAAK,EAAA,KAJWF,MAAAA,GAAAA,MAAAA,EAAAA,KACAC,UAAAA,GAAAA,UAAAA,EAAAA,KACAC,MAAAA,GAAAA,MAAAA;AAGhB,IAAA,IAAA,CAAKF,MAAAA,GAASA,MAAAA;AACd,IAAA,IAAA,CAAKC,UAAAA,GAAaA,UAAAA;AAClB,IAAA,IAAA,CAAKC,SAASA,MAAAA,IAAU,EAAA;AAC1B,EAAA;AACF;AAEO,MAAMC,oBAAoBC,IAAAA,CAAAA;EAhDjC;;;AAiDkBC,EAAAA,IAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,GAAAA;AAEAC,EAAAA,aAAAA;EAEhBC,WAAAA,GAA4B;AAC1B,IAAA,MAAMC,mBAAAA,mBAAsB,MAAA,CAAA,CAACC,IAAAA,EAAWC,OAAAA,KAAAA;AACtC,MAAA,MAAMC,YAAAA,GAAeD,OAAAA,CAAQE,KAAAA,CAAM,GAAA,CAAA;AACnC,MAAA,IAAIC,aAAAA,GAAgBJ,IAAAA;AACpB,MAAA,KAAA,MAAWK,WAAWH,YAAAA,EAAc;AAClC,QAAA,IAAIG,YAAY,GAAA,EAAK;AACnB,UAAA;AACF,QAAA;AACAD,QAAAA,aAAAA,GAAgBA,cAAcC,OAAAA,CAAAA;AAChC,MAAA;AACA,MAAA,OAAOD,aAAAA;IACT,CAAA,EAV4B,qBAAA,CAAA;AAY5B,IAAA,OAAO;MACLE,IAAAA,EAAM,QAAA;MACNC,QAAAA,EAAU;AAAC,QAAA,MAAA;AAAQ,QAAA;;MACnBC,KAAAA,EAAOC,MAAAA,CAAOC,QAAQ,IAAA,CAAKb,aAAAA,CAAcc,KAAK,CAAA,CAAEC,OAAAA,CAAQ,CAAC,CAACC,IAAAA,EAAMC,QAAAA,CAAAA,KAC9DL,MAAAA,CAAOC,QAAQI,QAAAA,CAAAA,CAAUC,IAAI,CAAC,CAACC,MAAAA,EAAQC,UAAAA,CAAAA,MAAgC;QACrEC,oBAAAA,EAAsB,KAAA;QACtBC,UAAAA,EAAY;UACVN,IAAAA,EAAM;YACJO,KAAAA,EAAOP,IAAAA;YACPlB,WAAAA,EACE;AACJ,WAAA;UACAqB,MAAAA,EAAQ;YAAEI,KAAAA,EAAOJ,MAAAA;YAAQrB,WAAAA,EAAasB,UAAAA,CAAWI,WAAWJ,UAAAA,CAAWtB;AAAY,WAAA;AACnF,UAAA,GAAIsB,UAAAA,CAAWK,WAAAA,EAAaC,OAAAA,GAAU,kBAAA,GAAqBC,MAAAA,GACvD;AACEC,YAAAA,IAAAA,EAAMR,UAAAA,CAAWK,WAAAA,EAAaC,OAAAA,GAAU,kBAAA,CAAA,EAAqBC;AAC/D,WAAA,GACA,EAAC;AACL,UAAA,GAAIP,WAAWS,UAAAA,GACX;YACEA,UAAAA,EAAY;cACVpB,IAAAA,EAAM,QAAA;cACNY,oBAAAA,EAAsB,KAAA;AACtBX,cAAAA,QAAAA,EAAUU,UAAAA,CAAWS,UAAAA,CAClBC,MAAAA,CAAO,CAACC,CAAAA,KAAWA,CAAAA,CAAErB,QAAAA,KAAa,IAAA,CAAA,CAClCQ,GAAAA,CAAI,CAACa,CAAAA,KAAWA,EAAElC,IAAI,CAAA;cACzByB,UAAAA,EAAYF,UAAAA,CAAWS,WAAWG,MAAAA,CAChC,CAACC,KAAUF,CAAAA,KACT,CAACA,EAAEG,IAAAA,GACC;gBAAE,GAAGD,GAAAA;gBAAK,CAACF,CAAAA,CAAElC,IAAI,GAAG;AAAE,kBAAA,GAAGkC,CAAAA,CAAEJ,MAAAA;AAAQ7B,kBAAAA,WAAAA,EAAaiC,CAAAA,CAAElC;AAAK;eAAE,GACzD;gBACE,GAAGoC,GAAAA;AACH,gBAAA,CAAC/B,oBAAoB,IAAA,CAAKF,aAAAA,EAAe+B,EAAEG,IAAI,CAAA,EAAGrC,IAAAA,GAAO;AACvD,kBAAA,GAAGK,mBAAAA,CAAoB,IAAA,CAAKF,aAAAA,EAAe+B,CAAAA,CAAEG,IAAI,CAAA,EAAGP,MAAAA;AACpD7B,kBAAAA,WAAAA,EAAaI,mBAAAA,CAAoB,IAAA,CAAKF,aAAAA,EAAe+B,CAAAA,CAAEG,IAAI,CAAA,EAAGrC;AAChE;AACF,eAAA,EACN,EAAC;AAEL;AACF,WAAA,GACA;AACN;AACF,OAAA,CAAA,CAAA;AAEJ,KAAA;AACF,EAAA;AAEgBsC,EAAAA,OAAAA;EAEhB;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;AAEA,EAAA,WAAA,CAAmBC,OAAAA,EAA6B;AAC9C,IAAA,KAAA,CAAMA,OAAAA,CAAAA;AAEN,IAAA,IAAA,CAAKrC,aAAAA,GAAgBsC,KAAAA,CAAMD,OAAAA,CAAQrC,aAAa,CAAA;AAEhD,IAAA,IAAA,CAAKD,GAAAA,GAAM,IAAA,CAAKsC,OAAAA,CAAQtC,GAAAA,IAAO,IAAA,CAAKC,aAAAA,CAAcuC,OAAAA,EAASC,IAAAA,CAAK,CAACC,CAAAA,KAAWA,CAAAA,EAAG1C,GAAAA,CAAAA,EAAMA,GAAAA;AACrF,IAAA,IAAI,CAAC,KAAKA,GAAAA,EAAK;AACb,MAAA,MAAM,IAAI2C,WACR,wEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IAAA,CAAK7C,OAAOwC,OAAAA,CAAQxC,IAAAA,IAAQ,KAAKG,aAAAA,EAAe2C,IAAAA,EAAMC,OAAOC,IAAAA,EAAAA;AAC7D,IAAA,IAAI,CAAC,KAAKhD,IAAAA,EAAM;AACd,MAAA,MAAM,IAAI6C,WAAW,2DAAA,CAAA;AACvB,IAAA;AACA,IAAA,IAAA,CAAKP,OAAAA,GAAUW,OAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAAM;MAChCC,SAAAA,EAAW;AAAC,QAAA,MAAA;AAAQ,QAAA,KAAA;AAAO,QAAA,SAAA;AAAWC,QAAAA,WAAAA,CAAY,KAAKrD,IAAI;;MAC3DsD,OAAAA,EAAS;KACX,CAAA;AAEA,IAAA,IAAA,CAAKrD,cACHuC,OAAAA,CAAQvC,WAAAA,IACR,IAAA,CAAKE,aAAAA,EAAe2C,MAAM7C,WAAAA,IAC1B,4MAAA;AAGF,IAAA,IAAI,CAAC,KAAKA,WAAAA,EAAa;AACrB,MAAA,MAAM,IAAI4C,WAAW,kEAAA,CAAA;AACvB,IAAA;AACF,EAAA;EAEA,MAAgBU,IAAAA,CACdC,KAAAA,EACAC,QAAAA,EACAC,GAAAA,EACA;AACA,IAAA,IAAIvC,IAAAA,GAAeqC,MAAMrC,IAAAA,IAAQ,EAAA;AACjC,IAAA,MAAMjB,GAAAA,GAAM,IAAIyD,GAAAA,CAAI,IAAA,CAAKzD,GAAG,CAAA;AAC5Ba,IAAAA,MAAAA,CAAO6C,IAAAA,CAAKJ,MAAMxB,UAAAA,IAAc,EAAC,CAAA,CAAG6B,OAAAA,CAAQ,CAACC,GAAAA,KAAAA;AAC3C,MAAA,MAAMC,KAAAA,GAAQP,KAAAA,CAAMxB,UAAAA,CAAW8B,GAAAA,CAAAA;AAC/B,MAAA,MAAME,UAAU7C,IAAAA,CAAK8C,OAAAA,CAAQ,CAAA,CAAA,EAAIH,GAAAA,KAAQC,KAAAA,CAAAA;AACzC,MAAA,IAAIC,WAAW7C,IAAAA,EAAM;AACnBjB,QAAAA,GAAAA,CAAIgE,YAAAA,CAAaC,MAAAA,CAAOL,GAAAA,EAAKC,KAAAA,CAAAA;MAC/B,CAAA,MAAO;AACL5C,QAAAA,IAAAA,GAAO6C,OAAAA;AACT,MAAA;IACF,CAAA,CAAA;AACA9D,IAAAA,GAAAA,CAAIkE,QAAAA,GAAWC,IAAAA,CAAKnE,GAAAA,CAAIkE,QAAAA,EAAUjD,IAAAA,CAAAA;AAClC,IAAA,MAAMqB,OAAAA,GAAuB;AAC3B,MAAA,GAAG,KAAKA,OAAAA,CAAQ8B,YAAAA;AAChBC,MAAAA,MAAAA,EAAQC,YAAYC,GAAAA,CAAI;QAACf,GAAAA,CAAIa,MAAAA;AAAQ,QAAA,IAAA,CAAK/B,QAAQ8B,YAAAA,EAAcC;AAAQtC,OAAAA,CAAAA,MAAAA,CAAOyC,QAAAA,CAAAA,CAAAA;AAC/E3C,MAAAA,IAAAA,EAAM,CAAC4C,OAAAA,CAAQnB,KAAAA,CAAMzB,IAAI,CAAA,GAAIyB,MAAMzB,IAAAA,GAAO6C,MAAAA;MAC1CtD,MAAAA,EAAQkC,KAAAA,CAAMlC,OAAOuD,WAAAA,EAAW;MAChCC,OAAAA,EAAS;QAAEC,MAAAA,EAAQ,kBAAA;QAAoB,GAAG,IAAA,CAAKvC,QAAQ8B,YAAAA,EAAcQ;AAAQ;AAC/E,KAAA;AACA,IAAA,MAAMpB,GAAAA,CAAIpB,OAAAA,CAAQ0C,IAAAA,CAAK,aAAA,EAAe;AAAExC,MAAAA,OAAAA;AAAkBtC,MAAAA;KAAS,CAAA;AACnE,IAAA,IAAI;AACF,MAAA,MAAM+E,WAAW,MAAMC,KAAAA,CAAMhF,GAAAA,CAAIiF,QAAAA,IAAY3C,OAAAA,CAAAA;AAC7C,MAAA,MAAM4C,IAAAA,GAAO,MAAMH,QAAAA,CAASG,IAAAA,EAAI;AAChC,MAAA,MAAMC,SAAS,IAAI5F,iBAAAA,CAAkBwF,SAAStF,MAAAA,EAAQsF,QAAAA,CAASrF,YAAYwF,IAAAA,CAAAA;AAC3E,MAAA,MAAM1B,GAAAA,CAAIpB,OAAAA,CAAQ0C,IAAAA,CAAK,YAAA,EAAc;QAAEM,IAAAA,EAAMD,MAAAA;AAAQnF,QAAAA;OAAI,CAAA;AACzD,MAAA,OAAOmF,MAAAA;AACT,IAAA,CAAA,CAAA,OAASE,GAAAA,EAAK;AACZ,MAAA,MAAM,IAAIC,SAAAA,CAAU,CAAA,WAAA,EAActF,GAAAA,CAAAA,YAAAA,CAAAA,EAAmB;AAACqF,QAAAA;AAAI,OAAA,CAAA;AAC5D,IAAA;AACF,EAAA;EACAE,cAAAA,GAAiB;AACf,IAAA,OAAO;AACL,MAAA,GAAG,MAAMA,cAAAA,EAAAA;MACTtF,aAAAA,EAAeuF,KAAAA,CAAM,KAAKvF,aAAa,CAAA;AACvCH,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;AAClBC,MAAAA,GAAAA,EAAK,IAAA,CAAKA;AACZ,KAAA;AACF,EAAA;AACF","file":"openapi.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { join } from \"path\";\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n StringToolOutput,\n Tool,\n ToolError,\n ToolEmitter,\n} from \"@/tools/base.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { ValueError } from \"@/errors.js\";\nimport { SchemaObject } from \"ajv\";\nimport { parse } from \"yaml\";\nimport { isEmpty, isTruthy, clone, toCamelCase } from \"remeda\";\n\nexport interface OpenAPIToolOptions extends BaseToolOptions {\n name?: string;\n description?: string;\n openApiSchema: any;\n url?: string;\n fetchOptions?: RequestInit;\n}\n\nexport interface OpenAPIEvents {\n beforeFetch: Callback<{ options: RequestInit; url: URL }>;\n afterFetch: Callback<{ data: OpenAPIToolOutput; url: URL }>;\n}\n\nexport class OpenAPIToolOutput extends StringToolOutput {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly result = \"\",\n ) {\n super();\n this.status = status;\n this.statusText = statusText;\n this.result = result ?? \"\";\n }\n}\n\nexport class OpenAPITool extends Tool<OpenAPIToolOutput, OpenAPIToolOptions> {\n public readonly name: string;\n public readonly description: string;\n public readonly url: string;\n\n public readonly openApiSchema: any;\n\n inputSchema(): SchemaObject {\n const getReferencedObject = (json: any, refPath: string) => {\n const pathSegments = refPath.split(\"/\");\n let currentObject = json;\n for (const segment of pathSegments) {\n if (segment === \"#\") {\n continue;\n }\n currentObject = currentObject[segment];\n }\n return currentObject;\n };\n\n return {\n type: \"object\",\n required: [\"path\", \"method\"],\n oneOf: Object.entries(this.openApiSchema.paths).flatMap(([path, pathSpec]: [string, any]) =>\n Object.entries(pathSpec).map(([method, methodSpec]: [string, any]) => ({\n additionalProperties: false,\n properties: {\n path: {\n const: path,\n description:\n \"Do not replace variables in path, instead of, put them to the parameters object.\",\n },\n method: { const: method, description: methodSpec.summary || methodSpec.description },\n ...(methodSpec.requestBody?.content?.[\"application/json\"]?.schema\n ? {\n body: methodSpec.requestBody?.content?.[\"application/json\"]?.schema,\n }\n : {}),\n ...(methodSpec.parameters\n ? {\n parameters: {\n type: \"object\",\n additionalProperties: false,\n required: methodSpec.parameters\n .filter((p: any) => p.required === true)\n .map((p: any) => p.name),\n properties: methodSpec.parameters.reduce(\n (acc: any, p: any) =>\n !p.$ref\n ? { ...acc, [p.name]: { ...p.schema, description: p.name } }\n : {\n ...acc,\n [getReferencedObject(this.openApiSchema, p.$ref)?.name]: {\n ...getReferencedObject(this.openApiSchema, p.$ref)?.schema,\n description: getReferencedObject(this.openApiSchema, p.$ref)?.name,\n },\n },\n {},\n ),\n },\n }\n : {}),\n },\n })),\n ),\n } as const satisfies SchemaObject;\n }\n\n public readonly emitter: ToolEmitter<Record<string, any>, OpenAPIToolOutput, OpenAPIEvents>;\n\n static {\n this.register();\n }\n\n public constructor(options: OpenAPIToolOptions) {\n super(options);\n\n this.openApiSchema = parse(options.openApiSchema);\n\n this.url = this.options.url || this.openApiSchema.servers?.find((s: any) => s?.url)?.url;\n if (!this.url) {\n throw new ValueError(\n \"OpenAPI schema hasn't any server with url specified. Pass it manually.\",\n );\n }\n\n this.name = options.name ?? this.openApiSchema?.info?.title?.trim();\n if (!this.name) {\n throw new ValueError(\"OpenAPI schema hasn't 'name' specified. Pass it manually.\");\n }\n this.emitter = Emitter.root.child({\n namespace: [\"tool\", \"web\", \"openAPI\", toCamelCase(this.name)],\n creator: this,\n });\n\n this.description =\n options.description ||\n this.openApiSchema?.info?.description ||\n \"Performs REST API requests to the servers and retrieves the response. The server API interfaces are defined in OpenAPI schema. \\n\" +\n \"Only use the OpenAPI tool if you need to communicate to external servers.\";\n\n if (!this.description) {\n throw new ValueError(\"OpenAPI schema hasn't 'description' specified. Pass it manually.\");\n }\n }\n\n protected async _run(\n input: Record<string, any>,\n _options: Partial<BaseToolRunOptions>,\n run: GetRunContext<typeof this>,\n ) {\n let path: string = input.path || \"\";\n const url = new URL(this.url);\n Object.keys(input.parameters ?? {}).forEach((key) => {\n const value = input.parameters[key];\n const newPath = path.replace(`{${key}}`, value);\n if (newPath == path) {\n url.searchParams.append(key, value);\n } else {\n path = newPath;\n }\n });\n url.pathname = join(url.pathname, path);\n const options: RequestInit = {\n ...this.options.fetchOptions,\n signal: AbortSignal.any([run.signal, this.options.fetchOptions?.signal].filter(isTruthy)),\n body: !isEmpty(input.body) ? input.body : undefined,\n method: input.method.toLowerCase(),\n headers: { Accept: \"application/json\", ...this.options.fetchOptions?.headers },\n };\n await run.emitter.emit(\"beforeFetch\", { options: options, url: url });\n try {\n const response = await fetch(url.toString(), options);\n const text = await response.text();\n const output = new OpenAPIToolOutput(response.status, response.statusText, text);\n await run.emitter.emit(\"afterFetch\", { data: output, url });\n return output;\n } catch (err) {\n throw new ToolError(`Request to ${url} has failed.`, [err]);\n }\n }\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n openApiSchema: clone(this.openApiSchema),\n name: this.name,\n description: this.description,\n url: this.url,\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tools/python/output.ts"],"names":["PythonToolOutput","ToolOutput","FILE_PREFIX","stdout","stderr","exitCode","outputFiles","register","isEmpty","getTextContent","executionStatus","trim","isImage","filename","some","ext","toLowerCase","endsWith","files","length","map","file","id","join","filter","Boolean","createSnapshot","loadSnapshot","snapshot","Object","assign"],"mappings":";;;;;;AAQO,MAAMA,yBAAyBC,mBAAAA,CAAAA;EARtC;;;;;;;AASE,EAAA,OAAOC,WAAAA,GAAc,cAAA;AAErB,EAAA,WAAA,CACkBC,MAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,WAAAA,GAA4B,EAAA,EAC5C;AACA,IAAA,KAAA,EAAK,EAAA,IAAA,CALWH,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,QAAAA,GAAAA,QAAAA,EAAAA,IAAAA,CACAC,WAAAA,GAAAA,WAAAA;AAGlB;EAEA;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEAC,OAAAA,GAAU;AACR,IAAA,OAAO,KAAA;AACT;EAEAC,cAAAA,GAAiB;AACf,IAAA,MAAMC,kBACJ,IAAA,CAAKL,QAAAA,KAAa,IACd,iCAAA,GACA,CAAA,gCAAA,EAAmC,KAAKA,QAAQ,CAAA,CAAA,CAAA;AACtD,IAAA,MAAMF,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOQ,IAAAA,EAAI,GAAK,CAAA;;AAA8B,EAAA,IAAA,CAAKR,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AAC1F,IAAA,MAAMC,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOO,IAAAA,EAAI,GAAK,CAAA;;AAA2B,EAAA,IAAA,CAAKP,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AACvF,IAAA,MAAMQ,OAAAA,2BAAWC,QAAAA,KACf;AAAC,MAAA,MAAA;AAAQ,MAAA,MAAA;AAAQ,MAAA,OAAA;AAAS,MAAA,MAAA;AAAQ,MAAA;MAAQC,IAAAA,CAAK,CAACC,QAAQF,QAAAA,CAASG,WAAAA,GAAcC,QAAAA,CAASF,GAAAA,CAAAA,CAAAA,EAD1E,SAAA,CAAA;AAEhB,IAAA,MAAMG,KAAAA,GAAQ,IAAA,CAAKZ,WAAAA,CAAYa,MAAAA,GAC3B,oJAAA,GACA,IAAA,CAAKb,WAAAA,CACFc,GAAAA,CACC,CAACC,IAAAA,KACC,CAAA,EAAGT,OAAAA,CAAQS,KAAKR,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,CAAA,EAAMQ,IAAAA,CAAKR,QAAQ,CAAA,EAAA,EAAKb,gBAAAA,CAAiBE,WAAW,CAAA,CAAA,EAAImB,IAAAA,CAAKC,EAAE,CAAA,CAAA,CAAG,CAAA,CAEvGC,IAAAA,CAAK,IAAA,CAAA,GACR,IAAA;AAEJ,IAAA,OAAO;AAACb,MAAAA,eAAAA;AAAiBP,MAAAA,MAAAA;AAAQC,MAAAA,MAAAA;AAAQc,MAAAA;MAAOM,MAAAA,CAAOC,OAAAA,CAAAA,CAASF,IAAAA,CAAK,IAAA,CAAA;AACvE;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLvB,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,QAAAA,EAAU,IAAA,CAAKA,QAAAA;AACfC,MAAAA,WAAAA,EAAa,IAAA,CAAKA;AACpB,KAAA;AACF;AAEAqB,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB;AACF","file":"output.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ToolOutput } from \"@/tools/base.js\";\nimport { PythonFile } from \"@/tools/python/storage.js\";\n\nexport class PythonToolOutput extends ToolOutput {\n static FILE_PREFIX = \"urn:bee:file\";\n\n constructor(\n public readonly stdout: string,\n public readonly stderr: string,\n public readonly exitCode?: number,\n public readonly outputFiles: PythonFile[] = [],\n ) {\n super();\n }\n\n static {\n this.register();\n }\n\n isEmpty() {\n return false;\n }\n\n getTextContent() {\n const executionStatus =\n this.exitCode === 0\n ? \"The code executed successfully.\"\n : `The code exited with error code ${this.exitCode}.`;\n const stdout = this.stdout.trim() ? `Standard output: \\n\\`\\`\\`\\n${this.stdout}\\n\\`\\`\\`` : null;\n const stderr = this.stderr.trim() ? `Error output: \\n\\`\\`\\`\\n${this.stderr}\\n\\`\\`\\`` : null;\n const isImage = (filename: string) =>\n [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"].some((ext) => filename.toLowerCase().endsWith(ext));\n const files = this.outputFiles.length\n ? \"The following files were created or modified. The user does not see them yet. To present a file to the user, send them the link below, verbatim:\\n\" +\n this.outputFiles\n .map(\n (file) =>\n `${isImage(file.filename) ? \"!\" : \"\"}[${file.filename}](${PythonToolOutput.FILE_PREFIX}:${file.id})`,\n )\n .join(\"\\n\")\n : null;\n\n return [executionStatus, stdout, stderr, files].filter(Boolean).join(\"\\n\");\n }\n\n createSnapshot() {\n return {\n stdout: this.stdout,\n stderr: this.stderr,\n exitCode: this.exitCode,\n outputFiles: this.outputFiles,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/tools/python/output.ts"],"names":["PythonToolOutput","ToolOutput","FILE_PREFIX","stdout","stderr","exitCode","outputFiles","register","isEmpty","getTextContent","executionStatus","trim","isImage","filename","some","ext","toLowerCase","endsWith","files","length","map","file","id","join","filter","Boolean","createSnapshot","loadSnapshot","snapshot","Object","assign"],"mappings":";;;;;;AAQO,MAAMA,yBAAyBC,mBAAAA,CAAAA;EARtC;;;;;;;AASE,EAAA,OAAOC,WAAAA,GAAc,cAAA;AAErB,EAAA,WAAA,CACkBC,MAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,WAAAA,GAA4B,EAAA,EAC5C;AACA,IAAA,KAAA,EAAK,EAAA,IAAA,CALWH,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,QAAAA,GAAAA,QAAAA,EAAAA,IAAAA,CACAC,WAAAA,GAAAA,WAAAA;AAGlB,EAAA;EAEA;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEAC,OAAAA,GAAU;AACR,IAAA,OAAO,KAAA;AACT,EAAA;EAEAC,cAAAA,GAAiB;AACf,IAAA,MAAMC,kBACJ,IAAA,CAAKL,QAAAA,KAAa,IACd,iCAAA,GACA,CAAA,gCAAA,EAAmC,KAAKA,QAAQ,CAAA,CAAA,CAAA;AACtD,IAAA,MAAMF,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOQ,IAAAA,EAAI,GAAK,CAAA;;AAA8B,EAAA,IAAA,CAAKR,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AAC1F,IAAA,MAAMC,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOO,IAAAA,EAAI,GAAK,CAAA;;AAA2B,EAAA,IAAA,CAAKP,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AACvF,IAAA,MAAMQ,OAAAA,2BAAWC,QAAAA,KACf;AAAC,MAAA,MAAA;AAAQ,MAAA,MAAA;AAAQ,MAAA,OAAA;AAAS,MAAA,MAAA;AAAQ,MAAA;MAAQC,IAAAA,CAAK,CAACC,QAAQF,QAAAA,CAASG,WAAAA,GAAcC,QAAAA,CAASF,GAAAA,CAAAA,CAAAA,EAD1E,SAAA,CAAA;AAEhB,IAAA,MAAMG,KAAAA,GAAQ,IAAA,CAAKZ,WAAAA,CAAYa,MAAAA,GAC3B,oJAAA,GACA,IAAA,CAAKb,WAAAA,CACFc,GAAAA,CACC,CAACC,IAAAA,KACC,CAAA,EAAGT,OAAAA,CAAQS,KAAKR,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,CAAA,EAAMQ,IAAAA,CAAKR,QAAQ,CAAA,EAAA,EAAKb,gBAAAA,CAAiBE,WAAW,CAAA,CAAA,EAAImB,IAAAA,CAAKC,EAAE,CAAA,CAAA,CAAG,CAAA,CAEvGC,IAAAA,CAAK,IAAA,CAAA,GACR,IAAA;AAEJ,IAAA,OAAO;AAACb,MAAAA,eAAAA;AAAiBP,MAAAA,MAAAA;AAAQC,MAAAA,MAAAA;AAAQc,MAAAA;MAAOM,MAAAA,CAAOC,OAAAA,CAAAA,CAASF,IAAAA,CAAK,IAAA,CAAA;AACvE,EAAA;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLvB,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,QAAAA,EAAU,IAAA,CAAKA,QAAAA;AACfC,MAAAA,WAAAA,EAAa,IAAA,CAAKA;AACpB,KAAA;AACF,EAAA;AAEAqB,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB,EAAA;AACF","file":"output.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ToolOutput } from \"@/tools/base.js\";\nimport { PythonFile } from \"@/tools/python/storage.js\";\n\nexport class PythonToolOutput extends ToolOutput {\n static FILE_PREFIX = \"urn:bee:file\";\n\n constructor(\n public readonly stdout: string,\n public readonly stderr: string,\n public readonly exitCode?: number,\n public readonly outputFiles: PythonFile[] = [],\n ) {\n super();\n }\n\n static {\n this.register();\n }\n\n isEmpty() {\n return false;\n }\n\n getTextContent() {\n const executionStatus =\n this.exitCode === 0\n ? \"The code executed successfully.\"\n : `The code exited with error code ${this.exitCode}.`;\n const stdout = this.stdout.trim() ? `Standard output: \\n\\`\\`\\`\\n${this.stdout}\\n\\`\\`\\`` : null;\n const stderr = this.stderr.trim() ? `Error output: \\n\\`\\`\\`\\n${this.stderr}\\n\\`\\`\\`` : null;\n const isImage = (filename: string) =>\n [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"].some((ext) => filename.toLowerCase().endsWith(ext));\n const files = this.outputFiles.length\n ? \"The following files were created or modified. The user does not see them yet. To present a file to the user, send them the link below, verbatim:\\n\" +\n this.outputFiles\n .map(\n (file) =>\n `${isImage(file.filename) ? \"!\" : \"\"}[${file.filename}](${PythonToolOutput.FILE_PREFIX}:${file.id})`,\n )\n .join(\"\\n\")\n : null;\n\n return [executionStatus, stdout, stderr, files].filter(Boolean).join(\"\\n\");\n }\n\n createSnapshot() {\n return {\n stdout: this.stdout,\n stderr: this.stderr,\n exitCode: this.exitCode,\n outputFiles: this.outputFiles,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { ToolOutput } from '../base.cjs';
2
2
  import { PythonFile } from './storage.cjs';
3
3
  import 'ajv';
4
4
  import '../../context.cjs';
5
- import '../../emitter-UkIkNrek.cjs';
5
+ import '../../emitter-D4OcelZ9.cjs';
6
6
  import '../../internals/types.cjs';
7
7
  import '../../internals/helpers/guards.cjs';
8
8
  import '../../internals/serializable.cjs';
@@ -2,7 +2,7 @@ import { ToolOutput } from '../base.js';
2
2
  import { PythonFile } from './storage.js';
3
3
  import 'ajv';
4
4
  import '../../context.js';
5
- import '../../emitter-CL56qab4.js';
5
+ import '../../emitter-kHxkUxco.js';
6
6
  import '../../internals/types.js';
7
7
  import '../../internals/helpers/guards.js';
8
8
  import '../../internals/serializable.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tools/python/output.ts"],"names":["PythonToolOutput","ToolOutput","FILE_PREFIX","stdout","stderr","exitCode","outputFiles","register","isEmpty","getTextContent","executionStatus","trim","isImage","filename","some","ext","toLowerCase","endsWith","files","length","map","file","id","join","filter","Boolean","createSnapshot","loadSnapshot","snapshot","Object","assign"],"mappings":";;;;AAQO,MAAMA,yBAAyBC,UAAAA,CAAAA;EARtC;;;;;;;AASE,EAAA,OAAOC,WAAAA,GAAc,cAAA;AAErB,EAAA,WAAA,CACkBC,MAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,WAAAA,GAA4B,EAAA,EAC5C;AACA,IAAA,KAAA,EAAK,EAAA,IAAA,CALWH,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,QAAAA,GAAAA,QAAAA,EAAAA,IAAAA,CACAC,WAAAA,GAAAA,WAAAA;AAGlB;EAEA;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEAC,OAAAA,GAAU;AACR,IAAA,OAAO,KAAA;AACT;EAEAC,cAAAA,GAAiB;AACf,IAAA,MAAMC,kBACJ,IAAA,CAAKL,QAAAA,KAAa,IACd,iCAAA,GACA,CAAA,gCAAA,EAAmC,KAAKA,QAAQ,CAAA,CAAA,CAAA;AACtD,IAAA,MAAMF,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOQ,IAAAA,EAAI,GAAK,CAAA;;AAA8B,EAAA,IAAA,CAAKR,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AAC1F,IAAA,MAAMC,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOO,IAAAA,EAAI,GAAK,CAAA;;AAA2B,EAAA,IAAA,CAAKP,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AACvF,IAAA,MAAMQ,OAAAA,2BAAWC,QAAAA,KACf;AAAC,MAAA,MAAA;AAAQ,MAAA,MAAA;AAAQ,MAAA,OAAA;AAAS,MAAA,MAAA;AAAQ,MAAA;MAAQC,IAAAA,CAAK,CAACC,QAAQF,QAAAA,CAASG,WAAAA,GAAcC,QAAAA,CAASF,GAAAA,CAAAA,CAAAA,EAD1E,SAAA,CAAA;AAEhB,IAAA,MAAMG,KAAAA,GAAQ,IAAA,CAAKZ,WAAAA,CAAYa,MAAAA,GAC3B,oJAAA,GACA,IAAA,CAAKb,WAAAA,CACFc,GAAAA,CACC,CAACC,IAAAA,KACC,CAAA,EAAGT,OAAAA,CAAQS,KAAKR,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,CAAA,EAAMQ,IAAAA,CAAKR,QAAQ,CAAA,EAAA,EAAKb,gBAAAA,CAAiBE,WAAW,CAAA,CAAA,EAAImB,IAAAA,CAAKC,EAAE,CAAA,CAAA,CAAG,CAAA,CAEvGC,IAAAA,CAAK,IAAA,CAAA,GACR,IAAA;AAEJ,IAAA,OAAO;AAACb,MAAAA,eAAAA;AAAiBP,MAAAA,MAAAA;AAAQC,MAAAA,MAAAA;AAAQc,MAAAA;MAAOM,MAAAA,CAAOC,OAAAA,CAAAA,CAASF,IAAAA,CAAK,IAAA,CAAA;AACvE;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLvB,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,QAAAA,EAAU,IAAA,CAAKA,QAAAA;AACfC,MAAAA,WAAAA,EAAa,IAAA,CAAKA;AACpB,KAAA;AACF;AAEAqB,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB;AACF","file":"output.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ToolOutput } from \"@/tools/base.js\";\nimport { PythonFile } from \"@/tools/python/storage.js\";\n\nexport class PythonToolOutput extends ToolOutput {\n static FILE_PREFIX = \"urn:bee:file\";\n\n constructor(\n public readonly stdout: string,\n public readonly stderr: string,\n public readonly exitCode?: number,\n public readonly outputFiles: PythonFile[] = [],\n ) {\n super();\n }\n\n static {\n this.register();\n }\n\n isEmpty() {\n return false;\n }\n\n getTextContent() {\n const executionStatus =\n this.exitCode === 0\n ? \"The code executed successfully.\"\n : `The code exited with error code ${this.exitCode}.`;\n const stdout = this.stdout.trim() ? `Standard output: \\n\\`\\`\\`\\n${this.stdout}\\n\\`\\`\\`` : null;\n const stderr = this.stderr.trim() ? `Error output: \\n\\`\\`\\`\\n${this.stderr}\\n\\`\\`\\`` : null;\n const isImage = (filename: string) =>\n [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"].some((ext) => filename.toLowerCase().endsWith(ext));\n const files = this.outputFiles.length\n ? \"The following files were created or modified. The user does not see them yet. To present a file to the user, send them the link below, verbatim:\\n\" +\n this.outputFiles\n .map(\n (file) =>\n `${isImage(file.filename) ? \"!\" : \"\"}[${file.filename}](${PythonToolOutput.FILE_PREFIX}:${file.id})`,\n )\n .join(\"\\n\")\n : null;\n\n return [executionStatus, stdout, stderr, files].filter(Boolean).join(\"\\n\");\n }\n\n createSnapshot() {\n return {\n stdout: this.stdout,\n stderr: this.stderr,\n exitCode: this.exitCode,\n outputFiles: this.outputFiles,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/tools/python/output.ts"],"names":["PythonToolOutput","ToolOutput","FILE_PREFIX","stdout","stderr","exitCode","outputFiles","register","isEmpty","getTextContent","executionStatus","trim","isImage","filename","some","ext","toLowerCase","endsWith","files","length","map","file","id","join","filter","Boolean","createSnapshot","loadSnapshot","snapshot","Object","assign"],"mappings":";;;;AAQO,MAAMA,yBAAyBC,UAAAA,CAAAA;EARtC;;;;;;;AASE,EAAA,OAAOC,WAAAA,GAAc,cAAA;AAErB,EAAA,WAAA,CACkBC,MAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,WAAAA,GAA4B,EAAA,EAC5C;AACA,IAAA,KAAA,EAAK,EAAA,IAAA,CALWH,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,MAAAA,GAAAA,MAAAA,EAAAA,IAAAA,CACAC,QAAAA,GAAAA,QAAAA,EAAAA,IAAAA,CACAC,WAAAA,GAAAA,WAAAA;AAGlB,EAAA;EAEA;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEAC,OAAAA,GAAU;AACR,IAAA,OAAO,KAAA;AACT,EAAA;EAEAC,cAAAA,GAAiB;AACf,IAAA,MAAMC,kBACJ,IAAA,CAAKL,QAAAA,KAAa,IACd,iCAAA,GACA,CAAA,gCAAA,EAAmC,KAAKA,QAAQ,CAAA,CAAA,CAAA;AACtD,IAAA,MAAMF,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOQ,IAAAA,EAAI,GAAK,CAAA;;AAA8B,EAAA,IAAA,CAAKR,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AAC1F,IAAA,MAAMC,MAAAA,GAAS,IAAA,CAAKA,MAAAA,CAAOO,IAAAA,EAAI,GAAK,CAAA;;AAA2B,EAAA,IAAA,CAAKP,MAAM;AAAa,MAAA,CAAA,GAAA,IAAA;AACvF,IAAA,MAAMQ,OAAAA,2BAAWC,QAAAA,KACf;AAAC,MAAA,MAAA;AAAQ,MAAA,MAAA;AAAQ,MAAA,OAAA;AAAS,MAAA,MAAA;AAAQ,MAAA;MAAQC,IAAAA,CAAK,CAACC,QAAQF,QAAAA,CAASG,WAAAA,GAAcC,QAAAA,CAASF,GAAAA,CAAAA,CAAAA,EAD1E,SAAA,CAAA;AAEhB,IAAA,MAAMG,KAAAA,GAAQ,IAAA,CAAKZ,WAAAA,CAAYa,MAAAA,GAC3B,oJAAA,GACA,IAAA,CAAKb,WAAAA,CACFc,GAAAA,CACC,CAACC,IAAAA,KACC,CAAA,EAAGT,OAAAA,CAAQS,KAAKR,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,CAAA,EAAMQ,IAAAA,CAAKR,QAAQ,CAAA,EAAA,EAAKb,gBAAAA,CAAiBE,WAAW,CAAA,CAAA,EAAImB,IAAAA,CAAKC,EAAE,CAAA,CAAA,CAAG,CAAA,CAEvGC,IAAAA,CAAK,IAAA,CAAA,GACR,IAAA;AAEJ,IAAA,OAAO;AAACb,MAAAA,eAAAA;AAAiBP,MAAAA,MAAAA;AAAQC,MAAAA,MAAAA;AAAQc,MAAAA;MAAOM,MAAAA,CAAOC,OAAAA,CAAAA,CAASF,IAAAA,CAAK,IAAA,CAAA;AACvE,EAAA;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLvB,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,MAAAA,EAAQ,IAAA,CAAKA,MAAAA;AACbC,MAAAA,QAAAA,EAAU,IAAA,CAAKA,QAAAA;AACfC,MAAAA,WAAAA,EAAa,IAAA,CAAKA;AACpB,KAAA;AACF,EAAA;AAEAqB,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB,EAAA;AACF","file":"output.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ToolOutput } from \"@/tools/base.js\";\nimport { PythonFile } from \"@/tools/python/storage.js\";\n\nexport class PythonToolOutput extends ToolOutput {\n static FILE_PREFIX = \"urn:bee:file\";\n\n constructor(\n public readonly stdout: string,\n public readonly stderr: string,\n public readonly exitCode?: number,\n public readonly outputFiles: PythonFile[] = [],\n ) {\n super();\n }\n\n static {\n this.register();\n }\n\n isEmpty() {\n return false;\n }\n\n getTextContent() {\n const executionStatus =\n this.exitCode === 0\n ? \"The code executed successfully.\"\n : `The code exited with error code ${this.exitCode}.`;\n const stdout = this.stdout.trim() ? `Standard output: \\n\\`\\`\\`\\n${this.stdout}\\n\\`\\`\\`` : null;\n const stderr = this.stderr.trim() ? `Error output: \\n\\`\\`\\`\\n${this.stderr}\\n\\`\\`\\`` : null;\n const isImage = (filename: string) =>\n [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"].some((ext) => filename.toLowerCase().endsWith(ext));\n const files = this.outputFiles.length\n ? \"The following files were created or modified. The user does not see them yet. To present a file to the user, send them the link below, verbatim:\\n\" +\n this.outputFiles\n .map(\n (file) =>\n `${isImage(file.filename) ? \"!\" : \"\"}[${file.filename}](${PythonToolOutput.FILE_PREFIX}:${file.id})`,\n )\n .join(\"\\n\")\n : null;\n\n return [executionStatus, stdout, stderr, files].filter(Boolean).join(\"\\n\");\n }\n\n createSnapshot() {\n return {\n stdout: this.stdout,\n stderr: this.stderr,\n exitCode: this.exitCode,\n outputFiles: this.outputFiles,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
@@ -138,7 +138,7 @@ async function callCodeInterpreter({ url, body, signal }) {
138
138
  body: JSON.stringify(body),
139
139
  signal
140
140
  }).catch((error) => {
141
- if (error.cause.name == "HTTPParserError") {
141
+ if (error.cause?.name === "HTTPParserError") {
142
142
  throw new base_cjs.ToolError("Request to code interpreter has failed -- ensure that CODE_INTERPRETER_URL points to the new HTTP endpoint (default port: 50081).", [
143
143
  error
144
144
  ]);
@@ -148,7 +148,10 @@ async function callCodeInterpreter({ url, body, signal }) {
148
148
  ]);
149
149
  }
150
150
  });
151
- if (!response?.ok && response.status > 400) {
151
+ if (!response) {
152
+ throw new base_cjs.ToolError("Request to code interpreter has failed.");
153
+ }
154
+ if (!response.ok && response.status >= 400) {
152
155
  throw new base_cjs.ToolError(`Request to code interpreter has failed with HTTP status code ${response.status}.`, [
153
156
  new Error(await response.text())
154
157
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tools/python/python.ts"],"names":["PythonTool","Tool","name","description","join","storage","files","emitter","Emitter","root","child","namespace","creator","inputSchema","list","fileNames","unique","map","filename","z","object","language","enum","describe","code","string","hasMinLength","inputFiles","array","preprocess","options","codeInterpreter","url","ValidationError","message","data","propertyName","register","_run","input","_options","run","pipe","uniqueBy","f","filter","file","isIncludedIn","upload","getSourceCode","llm","promptTemplate","response","create","messages","UserMessage","render","abortSignal","signal","getTextContent","trim","prefix","result","callCodeInterpreter","body","source_code","Object","fromEntries","pythonId","filesOutput","download","entries","path","_","startsWith","String","slice","length","every","PythonToolOutput","stdout","stderr","exit_code","createSnapshot","shallowCopy","loadSnapshot","snapshot","fetch","method","headers","JSON","stringify","catch","error","cause","ToolError","ok","status","Error","text","json"],"mappings":"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","file":"python.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n ToolEmitter,\n Tool,\n ToolError,\n ToolInput,\n} from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { filter, isIncludedIn, map, pipe, unique, uniqueBy } from \"remeda\";\nimport { PythonFile, PythonStorage } from \"@/tools/python/storage.js\";\nimport { PythonToolOutput } from \"@/tools/python/output.js\";\nimport { ValidationError } from \"ajv\";\nimport { ConnectionOptions } from \"node:tls\";\nimport { RunContext } from \"@/context.js\";\nimport { hasMinLength } from \"@/internals/helpers/array.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { ChatModel } from \"@/backend/chat.js\";\nimport { UserMessage } from \"@/backend/message.js\";\n\nexport interface CodeInterpreterOptions {\n url: string;\n connectionOptions?: ConnectionOptions;\n}\n\nexport interface PythonToolOptions extends BaseToolOptions {\n codeInterpreter: CodeInterpreterOptions;\n preprocess?: {\n llm: ChatModel;\n promptTemplate: PromptTemplate.infer<{ input: string }>;\n };\n storage: PythonStorage;\n}\n\nexport class PythonTool extends Tool<PythonToolOutput, PythonToolOptions> {\n name = \"Python\";\n description = [\n \"Run Python and/or shell code and return the console output. Use for isolated calculations, computations, data or file manipulation but still prefer assistant's capabilities (IMPORTANT: Do not use for text analysis or summarization).\",\n \"Files provided by the user, or created in a previous run, will be accessible if and only if they are specified in the input. It is necessary to always print() results.\",\n \"The following shell commands are available:\",\n \"Use ffmpeg to convert videos.\",\n \"Use yt-dlp to download videos, and unless specified otherwise use `-S vcodec:h264,res,acodec:m4a` for video and `-x --audio-format mp3` for audio-only.\",\n \"Use pandoc to convert documents between formats (like MD, DOC, DOCX, PDF) -- and don't forget that you can create PDFs by writing markdown and then converting.\",\n \"In Python, the following modules are available:\",\n \"Use numpy, pandas, scipy and sympy for working with data.\",\n \"Use matplotlib to plot charts.\",\n \"Use pillow (import PIL) to create and manipulate images.\",\n \"Use moviepy for complex manipulations with videos.\",\n \"Use PyPDF2, pikepdf, or fitz to manipulate PDFs.\",\n \"Use pdf2image to convert PDF to images.\",\n \"Other Python libraries are also available -- however, prefer using the ones above.\",\n \"Prefer using qualified imports -- `import library; library.thing()` instead of `import thing from library`.\",\n \"Do not attempt to install libraries manually -- it will not work.\",\n \"Each invocation of Python runs in a completely fresh VM -- it will not remember anything from before.\",\n \"Do not use this tool multiple times in a row, always write the full code you want to run in a single invocation.\",\n ].join(\" \");\n\n public readonly storage: PythonStorage;\n protected files: PythonFile[] = [];\n\n public readonly emitter: ToolEmitter<ToolInput<this>, PythonToolOutput> = Emitter.root.child({\n namespace: [\"tool\", \"python\"],\n creator: this,\n });\n\n async inputSchema() {\n this.files = await this.storage.list();\n const fileNames = unique(map(this.files, ({ filename }) => filename));\n return z.object({\n language: z.enum([\"python\", \"shell\"]).describe(\"Use shell for ffmpeg, pandoc, yt-dlp\"),\n code: z.string().describe(\"full source code file that will be executed\"),\n ...(hasMinLength(fileNames, 1)\n ? {\n inputFiles: z\n .array(z.enum(fileNames))\n .describe(\n \"To access an existing file, you must specify it; otherwise, the file will not be accessible. IMPORTANT: If the file is not provided in the input, it will not be accessible.\",\n ),\n }\n : {}),\n });\n }\n\n protected readonly preprocess;\n\n public constructor(options: PythonToolOptions) {\n super(options);\n if (!options.codeInterpreter.url) {\n throw new ValidationError([\n {\n message: \"Property must be a valid URL!\",\n data: options,\n propertyName: \"codeInterpreter.url\",\n },\n ]);\n }\n this.preprocess = options.preprocess;\n this.storage = options.storage;\n }\n\n static {\n this.register();\n }\n\n protected async _run(\n input: ToolInput<this>,\n _options: Partial<BaseToolRunOptions>,\n run: RunContext<this>,\n ) {\n const inputFiles = await pipe(\n this.files ?? (await this.storage.list()),\n uniqueBy((f) => f.filename),\n filter((file) => isIncludedIn(file.filename, (input.inputFiles ?? []) as string[])),\n (files) => this.storage.upload(files),\n );\n\n const getSourceCode = async () => {\n if (this.preprocess) {\n const { llm, promptTemplate } = this.preprocess;\n const response = await llm.create({\n messages: [new UserMessage(promptTemplate.render({ input: input.code }))],\n abortSignal: run.signal,\n });\n return response.getTextContent().trim();\n }\n return input.code;\n };\n\n const prefix = \"/workspace/\";\n\n const result = await callCodeInterpreter({\n url: `${this.options.codeInterpreter.url}/v1/execute`,\n body: {\n source_code: await getSourceCode(),\n files: Object.fromEntries(\n inputFiles.map((file) => [`${prefix}${file.filename}`, file.pythonId]),\n ),\n },\n signal: run.signal,\n });\n\n const filesOutput = await this.storage.download(\n Object.entries(result.files)\n .filter(([path, _]) => path.startsWith(prefix))\n .map(([path, pythonId]) => ({ path: path, pythonId: String(pythonId) }))\n .map((file) => ({ filename: file.path.slice(prefix.length), pythonId: file.pythonId }))\n .filter((file) =>\n inputFiles.every(\n (input) => input.filename !== file.filename || input.pythonId !== file.pythonId,\n ),\n ),\n );\n\n return new PythonToolOutput(result.stdout, result.stderr, result.exit_code, filesOutput);\n }\n\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n files: shallowCopy(this.files),\n storage: this.storage,\n preprocess: this.preprocess,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void {\n super.loadSnapshot(snapshot);\n }\n}\n\nexport async function callCodeInterpreter({\n url,\n body,\n signal,\n}: {\n url: string;\n body: unknown;\n signal?: AbortSignal;\n}): Promise<Record<string, any>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal,\n }).catch((error) => {\n if (error.cause.name == \"HTTPParserError\") {\n throw new ToolError(\n \"Request to code interpreter has failed -- ensure that CODE_INTERPRETER_URL points to the new HTTP endpoint (default port: 50081).\",\n [error],\n );\n } else {\n throw new ToolError(\"Request to code interpreter has failed.\", [error]);\n }\n });\n\n if (!response?.ok && response.status > 400) {\n throw new ToolError(\n `Request to code interpreter has failed with HTTP status code ${response.status}.`,\n [new Error(await response.text())],\n );\n }\n\n return await response.json();\n}\n"]}
1
+ {"version":3,"sources":["../../../src/tools/python/python.ts"],"names":["PythonTool","Tool","name","description","join","storage","files","emitter","Emitter","root","child","namespace","creator","inputSchema","list","fileNames","unique","map","filename","z","object","language","enum","describe","code","string","hasMinLength","inputFiles","array","preprocess","options","codeInterpreter","url","ValidationError","message","data","propertyName","register","_run","input","_options","run","pipe","uniqueBy","f","filter","file","isIncludedIn","upload","getSourceCode","llm","promptTemplate","response","create","messages","UserMessage","render","abortSignal","signal","getTextContent","trim","prefix","result","callCodeInterpreter","body","source_code","Object","fromEntries","pythonId","filesOutput","download","entries","path","_","startsWith","String","slice","length","every","PythonToolOutput","stdout","stderr","exit_code","createSnapshot","shallowCopy","loadSnapshot","snapshot","fetch","method","headers","JSON","stringify","catch","error","cause","ToolError","ok","status","Error","text","json"],"mappings":"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","file":"python.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n ToolEmitter,\n Tool,\n ToolError,\n ToolInput,\n} from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { filter, isIncludedIn, map, pipe, unique, uniqueBy } from \"remeda\";\nimport { PythonFile, PythonStorage } from \"@/tools/python/storage.js\";\nimport { PythonToolOutput } from \"@/tools/python/output.js\";\nimport { ValidationError } from \"ajv\";\nimport { ConnectionOptions } from \"node:tls\";\nimport { RunContext } from \"@/context.js\";\nimport { hasMinLength } from \"@/internals/helpers/array.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { ChatModel } from \"@/backend/chat.js\";\nimport { UserMessage } from \"@/backend/message.js\";\n\nexport interface CodeInterpreterOptions {\n url: string;\n connectionOptions?: ConnectionOptions;\n}\n\nexport interface PythonToolOptions extends BaseToolOptions {\n codeInterpreter: CodeInterpreterOptions;\n preprocess?: {\n llm: ChatModel;\n promptTemplate: PromptTemplate.infer<{ input: string }>;\n };\n storage: PythonStorage;\n}\n\nexport class PythonTool extends Tool<PythonToolOutput, PythonToolOptions> {\n name = \"Python\";\n description = [\n \"Run Python and/or shell code and return the console output. Use for isolated calculations, computations, data or file manipulation but still prefer assistant's capabilities (IMPORTANT: Do not use for text analysis or summarization).\",\n \"Files provided by the user, or created in a previous run, will be accessible if and only if they are specified in the input. It is necessary to always print() results.\",\n \"The following shell commands are available:\",\n \"Use ffmpeg to convert videos.\",\n \"Use yt-dlp to download videos, and unless specified otherwise use `-S vcodec:h264,res,acodec:m4a` for video and `-x --audio-format mp3` for audio-only.\",\n \"Use pandoc to convert documents between formats (like MD, DOC, DOCX, PDF) -- and don't forget that you can create PDFs by writing markdown and then converting.\",\n \"In Python, the following modules are available:\",\n \"Use numpy, pandas, scipy and sympy for working with data.\",\n \"Use matplotlib to plot charts.\",\n \"Use pillow (import PIL) to create and manipulate images.\",\n \"Use moviepy for complex manipulations with videos.\",\n \"Use PyPDF2, pikepdf, or fitz to manipulate PDFs.\",\n \"Use pdf2image to convert PDF to images.\",\n \"Other Python libraries are also available -- however, prefer using the ones above.\",\n \"Prefer using qualified imports -- `import library; library.thing()` instead of `import thing from library`.\",\n \"Do not attempt to install libraries manually -- it will not work.\",\n \"Each invocation of Python runs in a completely fresh VM -- it will not remember anything from before.\",\n \"Do not use this tool multiple times in a row, always write the full code you want to run in a single invocation.\",\n ].join(\" \");\n\n public readonly storage: PythonStorage;\n protected files: PythonFile[] = [];\n\n public readonly emitter: ToolEmitter<ToolInput<this>, PythonToolOutput> = Emitter.root.child({\n namespace: [\"tool\", \"python\"],\n creator: this,\n });\n\n async inputSchema() {\n this.files = await this.storage.list();\n const fileNames = unique(map(this.files, ({ filename }) => filename));\n return z.object({\n language: z.enum([\"python\", \"shell\"]).describe(\"Use shell for ffmpeg, pandoc, yt-dlp\"),\n code: z.string().describe(\"full source code file that will be executed\"),\n ...(hasMinLength(fileNames, 1)\n ? {\n inputFiles: z\n .array(z.enum(fileNames))\n .describe(\n \"To access an existing file, you must specify it; otherwise, the file will not be accessible. IMPORTANT: If the file is not provided in the input, it will not be accessible.\",\n ),\n }\n : {}),\n });\n }\n\n protected readonly preprocess;\n\n public constructor(options: PythonToolOptions) {\n super(options);\n if (!options.codeInterpreter.url) {\n throw new ValidationError([\n {\n message: \"Property must be a valid URL!\",\n data: options,\n propertyName: \"codeInterpreter.url\",\n },\n ]);\n }\n this.preprocess = options.preprocess;\n this.storage = options.storage;\n }\n\n static {\n this.register();\n }\n\n protected async _run(\n input: ToolInput<this>,\n _options: Partial<BaseToolRunOptions>,\n run: RunContext<this>,\n ) {\n const inputFiles = await pipe(\n this.files ?? (await this.storage.list()),\n uniqueBy((f) => f.filename),\n filter((file) => isIncludedIn(file.filename, (input.inputFiles ?? []) as string[])),\n (files) => this.storage.upload(files),\n );\n\n const getSourceCode = async () => {\n if (this.preprocess) {\n const { llm, promptTemplate } = this.preprocess;\n const response = await llm.create({\n messages: [new UserMessage(promptTemplate.render({ input: input.code }))],\n abortSignal: run.signal,\n });\n return response.getTextContent().trim();\n }\n return input.code;\n };\n\n const prefix = \"/workspace/\";\n\n const result = await callCodeInterpreter({\n url: `${this.options.codeInterpreter.url}/v1/execute`,\n body: {\n source_code: await getSourceCode(),\n files: Object.fromEntries(\n inputFiles.map((file) => [`${prefix}${file.filename}`, file.pythonId]),\n ),\n },\n signal: run.signal,\n });\n\n const filesOutput = await this.storage.download(\n Object.entries(result.files)\n .filter(([path, _]) => path.startsWith(prefix))\n .map(([path, pythonId]) => ({ path: path, pythonId: String(pythonId) }))\n .map((file) => ({ filename: file.path.slice(prefix.length), pythonId: file.pythonId }))\n .filter((file) =>\n inputFiles.every(\n (input) => input.filename !== file.filename || input.pythonId !== file.pythonId,\n ),\n ),\n );\n\n return new PythonToolOutput(result.stdout, result.stderr, result.exit_code, filesOutput);\n }\n\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n files: shallowCopy(this.files),\n storage: this.storage,\n preprocess: this.preprocess,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void {\n super.loadSnapshot(snapshot);\n }\n}\n\nexport async function callCodeInterpreter({\n url,\n body,\n signal,\n}: {\n url: string;\n body: unknown;\n signal?: AbortSignal;\n}): Promise<Record<string, any>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal,\n }).catch((error) => {\n if (error.cause?.name === \"HTTPParserError\") {\n throw new ToolError(\n \"Request to code interpreter has failed -- ensure that CODE_INTERPRETER_URL points to the new HTTP endpoint (default port: 50081).\",\n [error],\n );\n } else {\n throw new ToolError(\"Request to code interpreter has failed.\", [error]);\n }\n });\n\n if (!response) {\n throw new ToolError(\"Request to code interpreter has failed.\");\n }\n\n if (!response.ok && response.status >= 400) {\n throw new ToolError(\n `Request to code interpreter has failed with HTTP status code ${response.status}.`,\n [new Error(await response.text())],\n );\n }\n\n return await response.json();\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  import { BaseCache } from '../../cache/base.cjs';
2
2
  import * as promise_based_task from 'promise-based-task';
3
- import { BaseToolOptions, Tool, ToolEmitter, ToolInput, BaseToolRunOptions } from '../base.cjs';
3
+ import { Tool, BaseToolOptions, ToolEmitter, ToolInput, BaseToolRunOptions } from '../base.cjs';
4
4
  import { z } from 'zod';
5
5
  import { PromptTemplate } from '../../template.cjs';
6
6
  import { PythonStorage, PythonFile } from './storage.cjs';
7
7
  import { PythonToolOutput } from './output.cjs';
8
8
  import { ConnectionOptions } from 'node:tls';
9
9
  import { RunContext } from '../../context.cjs';
10
- import { E as Emitter } from '../../emitter-UkIkNrek.cjs';
11
- import { m as ChatModel } from '../../chat-DaqV3woF.cjs';
10
+ import { E as Emitter } from '../../emitter-D4OcelZ9.cjs';
11
+ import { a as ChatModel } from '../../chat-C20nYj46.cjs';
12
12
  import '../../internals/serializable.cjs';
13
13
  import '../../internals/types.cjs';
14
14
  import '../../internals/helpers/guards.cjs';
@@ -1,14 +1,14 @@
1
1
  import { BaseCache } from '../../cache/base.js';
2
2
  import * as promise_based_task from 'promise-based-task';
3
- import { BaseToolOptions, Tool, ToolEmitter, ToolInput, BaseToolRunOptions } from '../base.js';
3
+ import { Tool, BaseToolOptions, ToolEmitter, ToolInput, BaseToolRunOptions } from '../base.js';
4
4
  import { z } from 'zod';
5
5
  import { PromptTemplate } from '../../template.js';
6
6
  import { PythonStorage, PythonFile } from './storage.js';
7
7
  import { PythonToolOutput } from './output.js';
8
8
  import { ConnectionOptions } from 'node:tls';
9
9
  import { RunContext } from '../../context.js';
10
- import { E as Emitter } from '../../emitter-CL56qab4.js';
11
- import { m as ChatModel } from '../../chat-DTxmaKP0.js';
10
+ import { E as Emitter } from '../../emitter-kHxkUxco.js';
11
+ import { a as ChatModel } from '../../chat-CfTNfR60.js';
12
12
  import '../../internals/serializable.js';
13
13
  import '../../internals/types.js';
14
14
  import '../../internals/helpers/guards.js';
@@ -136,7 +136,7 @@ async function callCodeInterpreter({ url, body, signal }) {
136
136
  body: JSON.stringify(body),
137
137
  signal
138
138
  }).catch((error) => {
139
- if (error.cause.name == "HTTPParserError") {
139
+ if (error.cause?.name === "HTTPParserError") {
140
140
  throw new ToolError("Request to code interpreter has failed -- ensure that CODE_INTERPRETER_URL points to the new HTTP endpoint (default port: 50081).", [
141
141
  error
142
142
  ]);
@@ -146,7 +146,10 @@ async function callCodeInterpreter({ url, body, signal }) {
146
146
  ]);
147
147
  }
148
148
  });
149
- if (!response?.ok && response.status > 400) {
149
+ if (!response) {
150
+ throw new ToolError("Request to code interpreter has failed.");
151
+ }
152
+ if (!response.ok && response.status >= 400) {
150
153
  throw new ToolError(`Request to code interpreter has failed with HTTP status code ${response.status}.`, [
151
154
  new Error(await response.text())
152
155
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tools/python/python.ts"],"names":["PythonTool","Tool","name","description","join","storage","files","emitter","Emitter","root","child","namespace","creator","inputSchema","list","fileNames","unique","map","filename","z","object","language","enum","describe","code","string","hasMinLength","inputFiles","array","preprocess","options","codeInterpreter","url","ValidationError","message","data","propertyName","register","_run","input","_options","run","pipe","uniqueBy","f","filter","file","isIncludedIn","upload","getSourceCode","llm","promptTemplate","response","create","messages","UserMessage","render","abortSignal","signal","getTextContent","trim","prefix","result","callCodeInterpreter","body","source_code","Object","fromEntries","pythonId","filesOutput","download","entries","path","_","startsWith","String","slice","length","every","PythonToolOutput","stdout","stderr","exit_code","createSnapshot","shallowCopy","loadSnapshot","snapshot","fetch","method","headers","JSON","stringify","catch","error","cause","ToolError","ok","status","Error","text","json"],"mappings":"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","file":"python.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n ToolEmitter,\n Tool,\n ToolError,\n ToolInput,\n} from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { filter, isIncludedIn, map, pipe, unique, uniqueBy } from \"remeda\";\nimport { PythonFile, PythonStorage } from \"@/tools/python/storage.js\";\nimport { PythonToolOutput } from \"@/tools/python/output.js\";\nimport { ValidationError } from \"ajv\";\nimport { ConnectionOptions } from \"node:tls\";\nimport { RunContext } from \"@/context.js\";\nimport { hasMinLength } from \"@/internals/helpers/array.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { ChatModel } from \"@/backend/chat.js\";\nimport { UserMessage } from \"@/backend/message.js\";\n\nexport interface CodeInterpreterOptions {\n url: string;\n connectionOptions?: ConnectionOptions;\n}\n\nexport interface PythonToolOptions extends BaseToolOptions {\n codeInterpreter: CodeInterpreterOptions;\n preprocess?: {\n llm: ChatModel;\n promptTemplate: PromptTemplate.infer<{ input: string }>;\n };\n storage: PythonStorage;\n}\n\nexport class PythonTool extends Tool<PythonToolOutput, PythonToolOptions> {\n name = \"Python\";\n description = [\n \"Run Python and/or shell code and return the console output. Use for isolated calculations, computations, data or file manipulation but still prefer assistant's capabilities (IMPORTANT: Do not use for text analysis or summarization).\",\n \"Files provided by the user, or created in a previous run, will be accessible if and only if they are specified in the input. It is necessary to always print() results.\",\n \"The following shell commands are available:\",\n \"Use ffmpeg to convert videos.\",\n \"Use yt-dlp to download videos, and unless specified otherwise use `-S vcodec:h264,res,acodec:m4a` for video and `-x --audio-format mp3` for audio-only.\",\n \"Use pandoc to convert documents between formats (like MD, DOC, DOCX, PDF) -- and don't forget that you can create PDFs by writing markdown and then converting.\",\n \"In Python, the following modules are available:\",\n \"Use numpy, pandas, scipy and sympy for working with data.\",\n \"Use matplotlib to plot charts.\",\n \"Use pillow (import PIL) to create and manipulate images.\",\n \"Use moviepy for complex manipulations with videos.\",\n \"Use PyPDF2, pikepdf, or fitz to manipulate PDFs.\",\n \"Use pdf2image to convert PDF to images.\",\n \"Other Python libraries are also available -- however, prefer using the ones above.\",\n \"Prefer using qualified imports -- `import library; library.thing()` instead of `import thing from library`.\",\n \"Do not attempt to install libraries manually -- it will not work.\",\n \"Each invocation of Python runs in a completely fresh VM -- it will not remember anything from before.\",\n \"Do not use this tool multiple times in a row, always write the full code you want to run in a single invocation.\",\n ].join(\" \");\n\n public readonly storage: PythonStorage;\n protected files: PythonFile[] = [];\n\n public readonly emitter: ToolEmitter<ToolInput<this>, PythonToolOutput> = Emitter.root.child({\n namespace: [\"tool\", \"python\"],\n creator: this,\n });\n\n async inputSchema() {\n this.files = await this.storage.list();\n const fileNames = unique(map(this.files, ({ filename }) => filename));\n return z.object({\n language: z.enum([\"python\", \"shell\"]).describe(\"Use shell for ffmpeg, pandoc, yt-dlp\"),\n code: z.string().describe(\"full source code file that will be executed\"),\n ...(hasMinLength(fileNames, 1)\n ? {\n inputFiles: z\n .array(z.enum(fileNames))\n .describe(\n \"To access an existing file, you must specify it; otherwise, the file will not be accessible. IMPORTANT: If the file is not provided in the input, it will not be accessible.\",\n ),\n }\n : {}),\n });\n }\n\n protected readonly preprocess;\n\n public constructor(options: PythonToolOptions) {\n super(options);\n if (!options.codeInterpreter.url) {\n throw new ValidationError([\n {\n message: \"Property must be a valid URL!\",\n data: options,\n propertyName: \"codeInterpreter.url\",\n },\n ]);\n }\n this.preprocess = options.preprocess;\n this.storage = options.storage;\n }\n\n static {\n this.register();\n }\n\n protected async _run(\n input: ToolInput<this>,\n _options: Partial<BaseToolRunOptions>,\n run: RunContext<this>,\n ) {\n const inputFiles = await pipe(\n this.files ?? (await this.storage.list()),\n uniqueBy((f) => f.filename),\n filter((file) => isIncludedIn(file.filename, (input.inputFiles ?? []) as string[])),\n (files) => this.storage.upload(files),\n );\n\n const getSourceCode = async () => {\n if (this.preprocess) {\n const { llm, promptTemplate } = this.preprocess;\n const response = await llm.create({\n messages: [new UserMessage(promptTemplate.render({ input: input.code }))],\n abortSignal: run.signal,\n });\n return response.getTextContent().trim();\n }\n return input.code;\n };\n\n const prefix = \"/workspace/\";\n\n const result = await callCodeInterpreter({\n url: `${this.options.codeInterpreter.url}/v1/execute`,\n body: {\n source_code: await getSourceCode(),\n files: Object.fromEntries(\n inputFiles.map((file) => [`${prefix}${file.filename}`, file.pythonId]),\n ),\n },\n signal: run.signal,\n });\n\n const filesOutput = await this.storage.download(\n Object.entries(result.files)\n .filter(([path, _]) => path.startsWith(prefix))\n .map(([path, pythonId]) => ({ path: path, pythonId: String(pythonId) }))\n .map((file) => ({ filename: file.path.slice(prefix.length), pythonId: file.pythonId }))\n .filter((file) =>\n inputFiles.every(\n (input) => input.filename !== file.filename || input.pythonId !== file.pythonId,\n ),\n ),\n );\n\n return new PythonToolOutput(result.stdout, result.stderr, result.exit_code, filesOutput);\n }\n\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n files: shallowCopy(this.files),\n storage: this.storage,\n preprocess: this.preprocess,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void {\n super.loadSnapshot(snapshot);\n }\n}\n\nexport async function callCodeInterpreter({\n url,\n body,\n signal,\n}: {\n url: string;\n body: unknown;\n signal?: AbortSignal;\n}): Promise<Record<string, any>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal,\n }).catch((error) => {\n if (error.cause.name == \"HTTPParserError\") {\n throw new ToolError(\n \"Request to code interpreter has failed -- ensure that CODE_INTERPRETER_URL points to the new HTTP endpoint (default port: 50081).\",\n [error],\n );\n } else {\n throw new ToolError(\"Request to code interpreter has failed.\", [error]);\n }\n });\n\n if (!response?.ok && response.status > 400) {\n throw new ToolError(\n `Request to code interpreter has failed with HTTP status code ${response.status}.`,\n [new Error(await response.text())],\n );\n }\n\n return await response.json();\n}\n"]}
1
+ {"version":3,"sources":["../../../src/tools/python/python.ts"],"names":["PythonTool","Tool","name","description","join","storage","files","emitter","Emitter","root","child","namespace","creator","inputSchema","list","fileNames","unique","map","filename","z","object","language","enum","describe","code","string","hasMinLength","inputFiles","array","preprocess","options","codeInterpreter","url","ValidationError","message","data","propertyName","register","_run","input","_options","run","pipe","uniqueBy","f","filter","file","isIncludedIn","upload","getSourceCode","llm","promptTemplate","response","create","messages","UserMessage","render","abortSignal","signal","getTextContent","trim","prefix","result","callCodeInterpreter","body","source_code","Object","fromEntries","pythonId","filesOutput","download","entries","path","_","startsWith","String","slice","length","every","PythonToolOutput","stdout","stderr","exit_code","createSnapshot","shallowCopy","loadSnapshot","snapshot","fetch","method","headers","JSON","stringify","catch","error","cause","ToolError","ok","status","Error","text","json"],"mappings":"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","file":"python.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n BaseToolOptions,\n BaseToolRunOptions,\n ToolEmitter,\n Tool,\n ToolError,\n ToolInput,\n} from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { filter, isIncludedIn, map, pipe, unique, uniqueBy } from \"remeda\";\nimport { PythonFile, PythonStorage } from \"@/tools/python/storage.js\";\nimport { PythonToolOutput } from \"@/tools/python/output.js\";\nimport { ValidationError } from \"ajv\";\nimport { ConnectionOptions } from \"node:tls\";\nimport { RunContext } from \"@/context.js\";\nimport { hasMinLength } from \"@/internals/helpers/array.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { ChatModel } from \"@/backend/chat.js\";\nimport { UserMessage } from \"@/backend/message.js\";\n\nexport interface CodeInterpreterOptions {\n url: string;\n connectionOptions?: ConnectionOptions;\n}\n\nexport interface PythonToolOptions extends BaseToolOptions {\n codeInterpreter: CodeInterpreterOptions;\n preprocess?: {\n llm: ChatModel;\n promptTemplate: PromptTemplate.infer<{ input: string }>;\n };\n storage: PythonStorage;\n}\n\nexport class PythonTool extends Tool<PythonToolOutput, PythonToolOptions> {\n name = \"Python\";\n description = [\n \"Run Python and/or shell code and return the console output. Use for isolated calculations, computations, data or file manipulation but still prefer assistant's capabilities (IMPORTANT: Do not use for text analysis or summarization).\",\n \"Files provided by the user, or created in a previous run, will be accessible if and only if they are specified in the input. It is necessary to always print() results.\",\n \"The following shell commands are available:\",\n \"Use ffmpeg to convert videos.\",\n \"Use yt-dlp to download videos, and unless specified otherwise use `-S vcodec:h264,res,acodec:m4a` for video and `-x --audio-format mp3` for audio-only.\",\n \"Use pandoc to convert documents between formats (like MD, DOC, DOCX, PDF) -- and don't forget that you can create PDFs by writing markdown and then converting.\",\n \"In Python, the following modules are available:\",\n \"Use numpy, pandas, scipy and sympy for working with data.\",\n \"Use matplotlib to plot charts.\",\n \"Use pillow (import PIL) to create and manipulate images.\",\n \"Use moviepy for complex manipulations with videos.\",\n \"Use PyPDF2, pikepdf, or fitz to manipulate PDFs.\",\n \"Use pdf2image to convert PDF to images.\",\n \"Other Python libraries are also available -- however, prefer using the ones above.\",\n \"Prefer using qualified imports -- `import library; library.thing()` instead of `import thing from library`.\",\n \"Do not attempt to install libraries manually -- it will not work.\",\n \"Each invocation of Python runs in a completely fresh VM -- it will not remember anything from before.\",\n \"Do not use this tool multiple times in a row, always write the full code you want to run in a single invocation.\",\n ].join(\" \");\n\n public readonly storage: PythonStorage;\n protected files: PythonFile[] = [];\n\n public readonly emitter: ToolEmitter<ToolInput<this>, PythonToolOutput> = Emitter.root.child({\n namespace: [\"tool\", \"python\"],\n creator: this,\n });\n\n async inputSchema() {\n this.files = await this.storage.list();\n const fileNames = unique(map(this.files, ({ filename }) => filename));\n return z.object({\n language: z.enum([\"python\", \"shell\"]).describe(\"Use shell for ffmpeg, pandoc, yt-dlp\"),\n code: z.string().describe(\"full source code file that will be executed\"),\n ...(hasMinLength(fileNames, 1)\n ? {\n inputFiles: z\n .array(z.enum(fileNames))\n .describe(\n \"To access an existing file, you must specify it; otherwise, the file will not be accessible. IMPORTANT: If the file is not provided in the input, it will not be accessible.\",\n ),\n }\n : {}),\n });\n }\n\n protected readonly preprocess;\n\n public constructor(options: PythonToolOptions) {\n super(options);\n if (!options.codeInterpreter.url) {\n throw new ValidationError([\n {\n message: \"Property must be a valid URL!\",\n data: options,\n propertyName: \"codeInterpreter.url\",\n },\n ]);\n }\n this.preprocess = options.preprocess;\n this.storage = options.storage;\n }\n\n static {\n this.register();\n }\n\n protected async _run(\n input: ToolInput<this>,\n _options: Partial<BaseToolRunOptions>,\n run: RunContext<this>,\n ) {\n const inputFiles = await pipe(\n this.files ?? (await this.storage.list()),\n uniqueBy((f) => f.filename),\n filter((file) => isIncludedIn(file.filename, (input.inputFiles ?? []) as string[])),\n (files) => this.storage.upload(files),\n );\n\n const getSourceCode = async () => {\n if (this.preprocess) {\n const { llm, promptTemplate } = this.preprocess;\n const response = await llm.create({\n messages: [new UserMessage(promptTemplate.render({ input: input.code }))],\n abortSignal: run.signal,\n });\n return response.getTextContent().trim();\n }\n return input.code;\n };\n\n const prefix = \"/workspace/\";\n\n const result = await callCodeInterpreter({\n url: `${this.options.codeInterpreter.url}/v1/execute`,\n body: {\n source_code: await getSourceCode(),\n files: Object.fromEntries(\n inputFiles.map((file) => [`${prefix}${file.filename}`, file.pythonId]),\n ),\n },\n signal: run.signal,\n });\n\n const filesOutput = await this.storage.download(\n Object.entries(result.files)\n .filter(([path, _]) => path.startsWith(prefix))\n .map(([path, pythonId]) => ({ path: path, pythonId: String(pythonId) }))\n .map((file) => ({ filename: file.path.slice(prefix.length), pythonId: file.pythonId }))\n .filter((file) =>\n inputFiles.every(\n (input) => input.filename !== file.filename || input.pythonId !== file.pythonId,\n ),\n ),\n );\n\n return new PythonToolOutput(result.stdout, result.stderr, result.exit_code, filesOutput);\n }\n\n createSnapshot() {\n return {\n ...super.createSnapshot(),\n files: shallowCopy(this.files),\n storage: this.storage,\n preprocess: this.preprocess,\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void {\n super.loadSnapshot(snapshot);\n }\n}\n\nexport async function callCodeInterpreter({\n url,\n body,\n signal,\n}: {\n url: string;\n body: unknown;\n signal?: AbortSignal;\n}): Promise<Record<string, any>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal,\n }).catch((error) => {\n if (error.cause?.name === \"HTTPParserError\") {\n throw new ToolError(\n \"Request to code interpreter has failed -- ensure that CODE_INTERPRETER_URL points to the new HTTP endpoint (default port: 50081).\",\n [error],\n );\n } else {\n throw new ToolError(\"Request to code interpreter has failed.\", [error]);\n }\n });\n\n if (!response) {\n throw new ToolError(\"Request to code interpreter has failed.\");\n }\n\n if (!response.ok && response.status >= 400) {\n throw new ToolError(\n `Request to code interpreter has failed with HTTP status code ${response.status}.`,\n [new Error(await response.text())],\n );\n }\n\n return await response.json();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tools/python/storage.ts"],"names":["PythonStorage","Serializable","TemporaryStorage","files","list","slice","upload","map","file","id","pythonId","filename","download","filter","every","f","createSnapshot","loadSnapshot","snapshot","Object","assign","LocalPythonStorage","input","ignoredFiles","Set","init","fs","promises","mkdir","localWorkingDir","recursive","interpreterWorkingDir","readdir","withFileTypes","Promise","all","isFile","has","name","computeHash","path","join","toString","fileList","filesystemFile","find","copyFile","hash","crypto","createHash","pipeline","createReadStream","digest","shallowCopy"],"mappings":"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","file":"storage.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { PathLike } from \"fs\";\nimport * as crypto from \"node:crypto\";\nimport { pipeline } from \"node:stream/promises\";\nimport fs, { createReadStream } from \"node:fs\";\nimport { copyFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\n\nexport interface PythonFile {\n id: string;\n pythonId: string;\n filename: string;\n}\n\nexport interface PythonUploadFile {\n id: string;\n filename: string;\n}\n\nexport interface PythonDownloadFile {\n id?: string;\n filename: string;\n pythonId: string;\n}\n\nexport abstract class PythonStorage extends Serializable {\n /**\n * List all files that code interpreter can use.\n */\n abstract list(): Promise<PythonFile[]>;\n\n /**\n * Prepare subset of available files to code interpreter.\n */\n abstract upload(files: PythonUploadFile[]): Promise<PythonFile[]>;\n\n /**\n * Process updated/modified/deleted files from code interpreter response.\n */\n abstract download(files: PythonDownloadFile[]): Promise<PythonFile[]>;\n}\n\nexport class TemporaryStorage extends PythonStorage {\n protected files: PythonFile[] = [];\n\n async list() {\n return this.files.slice();\n }\n\n async upload(files: PythonUploadFile[]): Promise<PythonFile[]> {\n return files.map((file) => ({\n id: file.id,\n pythonId: file.id,\n filename: file.filename,\n }));\n }\n\n async download(files: PythonDownloadFile[]) {\n this.files = [\n ...this.files.filter((file) => files.every((f) => f.filename !== file.filename)),\n ...files.map((file) => ({ id: file.pythonId, ...file })),\n ];\n return this.files.slice();\n }\n\n createSnapshot() {\n return { files: this.files.slice() };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n\ninterface Input {\n localWorkingDir: PathLike;\n interpreterWorkingDir: PathLike;\n ignoredFiles?: Set<string>;\n}\n\nexport class LocalPythonStorage extends PythonStorage {\n protected readonly input: Required<Input>;\n\n constructor(input: Input) {\n super();\n this.input = {\n ...input,\n ignoredFiles: input?.ignoredFiles ?? new Set([\".gitkeep\"]),\n };\n }\n\n @Cache()\n protected async init() {\n await fs.promises.mkdir(this.input.localWorkingDir, { recursive: true });\n await fs.promises.mkdir(this.input.interpreterWorkingDir, { recursive: true });\n }\n\n async list(): Promise<PythonFile[]> {\n await this.init();\n\n const files = await fs.promises.readdir(this.input.localWorkingDir, {\n withFileTypes: true,\n recursive: false,\n });\n return Promise.all(\n files\n .filter((file) => file.isFile() && !this.input.ignoredFiles.has(file.name))\n .map(async (file) => {\n const pythonId = await this.computeHash(\n path.join(this.input.localWorkingDir.toString(), file.name),\n );\n\n return {\n id: pythonId,\n filename: file.name,\n pythonId,\n };\n }),\n );\n }\n\n async upload(files: PythonUploadFile[]): Promise<PythonFile[]> {\n await this.init();\n\n const fileList = await this.list();\n\n await Promise.all(\n files.map((file) => {\n const filesystemFile = fileList.find((filesystemFile) => filesystemFile.id === file.id)!;\n return copyFile(\n path.join(this.input.localWorkingDir.toString(), filesystemFile.filename),\n path.join(this.input.interpreterWorkingDir.toString(), filesystemFile.id),\n );\n }),\n );\n return files.map((file) => ({ ...file, pythonId: file.id }));\n }\n\n async download(files: PythonDownloadFile[]) {\n await this.init();\n\n await Promise.all(\n files.map((file) =>\n copyFile(\n path.join(this.input.interpreterWorkingDir.toString(), file.pythonId),\n path.join(this.input.localWorkingDir.toString(), file.filename),\n ),\n ),\n );\n return files.map((file) => ({ ...file, id: file.pythonId }));\n }\n\n protected async computeHash(file: PathLike) {\n const hash = crypto.createHash(\"sha256\");\n await pipeline(createReadStream(file), hash);\n return hash.digest(\"hex\");\n }\n\n createSnapshot() {\n return { input: shallowCopy(this.input) };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/tools/python/storage.ts"],"names":["PythonStorage","Serializable","TemporaryStorage","files","list","slice","upload","map","file","id","pythonId","filename","download","filter","every","f","createSnapshot","loadSnapshot","snapshot","Object","assign","LocalPythonStorage","input","ignoredFiles","Set","init","fs","promises","mkdir","localWorkingDir","recursive","interpreterWorkingDir","readdir","withFileTypes","Promise","all","isFile","has","name","computeHash","path","join","toString","fileList","filesystemFile","find","copyFile","hash","crypto","createHash","pipeline","createReadStream","digest","shallowCopy"],"mappings":"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","file":"storage.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { PathLike } from \"fs\";\nimport * as crypto from \"node:crypto\";\nimport { pipeline } from \"node:stream/promises\";\nimport fs, { createReadStream } from \"node:fs\";\nimport { copyFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\n\nexport interface PythonFile {\n id: string;\n pythonId: string;\n filename: string;\n}\n\nexport interface PythonUploadFile {\n id: string;\n filename: string;\n}\n\nexport interface PythonDownloadFile {\n id?: string;\n filename: string;\n pythonId: string;\n}\n\nexport abstract class PythonStorage extends Serializable {\n /**\n * List all files that code interpreter can use.\n */\n abstract list(): Promise<PythonFile[]>;\n\n /**\n * Prepare subset of available files to code interpreter.\n */\n abstract upload(files: PythonUploadFile[]): Promise<PythonFile[]>;\n\n /**\n * Process updated/modified/deleted files from code interpreter response.\n */\n abstract download(files: PythonDownloadFile[]): Promise<PythonFile[]>;\n}\n\nexport class TemporaryStorage extends PythonStorage {\n protected files: PythonFile[] = [];\n\n async list() {\n return this.files.slice();\n }\n\n async upload(files: PythonUploadFile[]): Promise<PythonFile[]> {\n return files.map((file) => ({\n id: file.id,\n pythonId: file.id,\n filename: file.filename,\n }));\n }\n\n async download(files: PythonDownloadFile[]) {\n this.files = [\n ...this.files.filter((file) => files.every((f) => f.filename !== file.filename)),\n ...files.map((file) => ({ id: file.pythonId, ...file })),\n ];\n return this.files.slice();\n }\n\n createSnapshot() {\n return { files: this.files.slice() };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n\ninterface Input {\n localWorkingDir: PathLike;\n interpreterWorkingDir: PathLike;\n ignoredFiles?: Set<string>;\n}\n\nexport class LocalPythonStorage extends PythonStorage {\n protected readonly input: Required<Input>;\n\n constructor(input: Input) {\n super();\n this.input = {\n ...input,\n ignoredFiles: input?.ignoredFiles ?? new Set([\".gitkeep\"]),\n };\n }\n\n @Cache()\n protected async init() {\n await fs.promises.mkdir(this.input.localWorkingDir, { recursive: true });\n await fs.promises.mkdir(this.input.interpreterWorkingDir, { recursive: true });\n }\n\n async list(): Promise<PythonFile[]> {\n await this.init();\n\n const files = await fs.promises.readdir(this.input.localWorkingDir, {\n withFileTypes: true,\n recursive: false,\n });\n return Promise.all(\n files\n .filter((file) => file.isFile() && !this.input.ignoredFiles.has(file.name))\n .map(async (file) => {\n const pythonId = await this.computeHash(\n path.join(this.input.localWorkingDir.toString(), file.name),\n );\n\n return {\n id: pythonId,\n filename: file.name,\n pythonId,\n };\n }),\n );\n }\n\n async upload(files: PythonUploadFile[]): Promise<PythonFile[]> {\n await this.init();\n\n const fileList = await this.list();\n\n await Promise.all(\n files.map((file) => {\n const filesystemFile = fileList.find((filesystemFile) => filesystemFile.id === file.id)!;\n return copyFile(\n path.join(this.input.localWorkingDir.toString(), filesystemFile.filename),\n path.join(this.input.interpreterWorkingDir.toString(), filesystemFile.id),\n );\n }),\n );\n return files.map((file) => ({ ...file, pythonId: file.id }));\n }\n\n async download(files: PythonDownloadFile[]) {\n await this.init();\n\n await Promise.all(\n files.map((file) =>\n copyFile(\n path.join(this.input.interpreterWorkingDir.toString(), file.pythonId),\n path.join(this.input.localWorkingDir.toString(), file.filename),\n ),\n ),\n );\n return files.map((file) => ({ ...file, id: file.pythonId }));\n }\n\n protected async computeHash(file: PathLike) {\n const hash = crypto.createHash(\"sha256\");\n await pipeline(createReadStream(file), hash);\n return hash.digest(\"hex\");\n }\n\n createSnapshot() {\n return { input: shallowCopy(this.input) };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}