@livekit/agents 0.7.9 → 1.0.0-next.0

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 (627) hide show
  1. package/dist/_exceptions.cjs +109 -0
  2. package/dist/_exceptions.cjs.map +1 -0
  3. package/dist/_exceptions.d.cts +64 -0
  4. package/dist/_exceptions.d.ts +64 -0
  5. package/dist/_exceptions.d.ts.map +1 -0
  6. package/dist/_exceptions.js +80 -0
  7. package/dist/_exceptions.js.map +1 -0
  8. package/dist/audio.cjs +10 -3
  9. package/dist/audio.cjs.map +1 -1
  10. package/dist/audio.d.cts +2 -0
  11. package/dist/audio.d.ts +2 -0
  12. package/dist/audio.d.ts.map +1 -1
  13. package/dist/audio.js +8 -2
  14. package/dist/audio.js.map +1 -1
  15. package/dist/cli.cjs +25 -0
  16. package/dist/cli.cjs.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +25 -0
  19. package/dist/cli.js.map +1 -1
  20. package/dist/constants.cjs +6 -3
  21. package/dist/constants.cjs.map +1 -1
  22. package/dist/constants.d.cts +2 -1
  23. package/dist/constants.d.ts +2 -1
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +4 -2
  26. package/dist/constants.js.map +1 -1
  27. package/dist/http_server.cjs.map +1 -1
  28. package/dist/http_server.d.cts +1 -0
  29. package/dist/http_server.d.ts +1 -0
  30. package/dist/http_server.d.ts.map +1 -1
  31. package/dist/http_server.js.map +1 -1
  32. package/dist/index.cjs +27 -20
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +13 -10
  35. package/dist/index.d.ts +13 -10
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +15 -11
  38. package/dist/index.js.map +1 -1
  39. package/dist/inference_runner.cjs +0 -1
  40. package/dist/inference_runner.cjs.map +1 -1
  41. package/dist/inference_runner.d.cts +2 -3
  42. package/dist/inference_runner.d.ts +2 -3
  43. package/dist/inference_runner.d.ts.map +1 -1
  44. package/dist/inference_runner.js +0 -1
  45. package/dist/inference_runner.js.map +1 -1
  46. package/dist/ipc/inference_proc_executor.cjs +2 -2
  47. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  48. package/dist/ipc/inference_proc_executor.js +2 -2
  49. package/dist/ipc/inference_proc_executor.js.map +1 -1
  50. package/dist/ipc/job_executor.cjs.map +1 -1
  51. package/dist/ipc/job_executor.js.map +1 -1
  52. package/dist/ipc/job_proc_executor.cjs +1 -0
  53. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  54. package/dist/ipc/job_proc_executor.js +1 -0
  55. package/dist/ipc/job_proc_executor.js.map +1 -1
  56. package/dist/ipc/job_proc_lazy_main.cjs +1 -1
  57. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  58. package/dist/ipc/job_proc_lazy_main.js +1 -1
  59. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  60. package/dist/ipc/supervised_proc.d.cts +1 -1
  61. package/dist/ipc/supervised_proc.d.ts +1 -1
  62. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  63. package/dist/job.cjs +14 -2
  64. package/dist/job.cjs.map +1 -1
  65. package/dist/job.d.cts +8 -0
  66. package/dist/job.d.ts +8 -0
  67. package/dist/job.d.ts.map +1 -1
  68. package/dist/job.js +12 -1
  69. package/dist/job.js.map +1 -1
  70. package/dist/llm/chat_context.cjs +332 -82
  71. package/dist/llm/chat_context.cjs.map +1 -1
  72. package/dist/llm/chat_context.d.cts +152 -48
  73. package/dist/llm/chat_context.d.ts +152 -48
  74. package/dist/llm/chat_context.d.ts.map +1 -1
  75. package/dist/llm/chat_context.js +327 -81
  76. package/dist/llm/chat_context.js.map +1 -1
  77. package/dist/llm/chat_context.test.cjs +380 -0
  78. package/dist/llm/chat_context.test.cjs.map +1 -0
  79. package/dist/llm/chat_context.test.js +385 -0
  80. package/dist/llm/chat_context.test.js.map +1 -0
  81. package/dist/llm/index.cjs +37 -8
  82. package/dist/llm/index.cjs.map +1 -1
  83. package/dist/llm/index.d.cts +7 -3
  84. package/dist/llm/index.d.ts +7 -3
  85. package/dist/llm/index.d.ts.map +1 -1
  86. package/dist/llm/index.js +39 -9
  87. package/dist/llm/index.js.map +1 -1
  88. package/dist/llm/llm.cjs +98 -33
  89. package/dist/llm/llm.cjs.map +1 -1
  90. package/dist/llm/llm.d.cts +50 -24
  91. package/dist/llm/llm.d.ts +50 -24
  92. package/dist/llm/llm.d.ts.map +1 -1
  93. package/dist/llm/llm.js +99 -33
  94. package/dist/llm/llm.js.map +1 -1
  95. package/dist/llm/provider_format/google.cjs +128 -0
  96. package/dist/llm/provider_format/google.cjs.map +1 -0
  97. package/dist/llm/provider_format/google.d.cts +6 -0
  98. package/dist/llm/provider_format/google.d.ts +6 -0
  99. package/dist/llm/provider_format/google.d.ts.map +1 -0
  100. package/dist/llm/provider_format/google.js +104 -0
  101. package/dist/llm/provider_format/google.js.map +1 -0
  102. package/dist/llm/provider_format/google.test.cjs +676 -0
  103. package/dist/llm/provider_format/google.test.cjs.map +1 -0
  104. package/dist/llm/provider_format/google.test.js +675 -0
  105. package/dist/llm/provider_format/google.test.js.map +1 -0
  106. package/dist/llm/provider_format/index.cjs +40 -0
  107. package/dist/llm/provider_format/index.cjs.map +1 -0
  108. package/dist/llm/provider_format/index.d.cts +4 -0
  109. package/dist/llm/provider_format/index.d.ts +4 -0
  110. package/dist/llm/provider_format/index.d.ts.map +1 -0
  111. package/dist/llm/provider_format/index.js +16 -0
  112. package/dist/llm/provider_format/index.js.map +1 -0
  113. package/dist/llm/provider_format/openai.cjs +116 -0
  114. package/dist/llm/provider_format/openai.cjs.map +1 -0
  115. package/dist/llm/provider_format/openai.d.cts +3 -0
  116. package/dist/llm/provider_format/openai.d.ts +3 -0
  117. package/dist/llm/provider_format/openai.d.ts.map +1 -0
  118. package/dist/llm/provider_format/openai.js +92 -0
  119. package/dist/llm/provider_format/openai.js.map +1 -0
  120. package/dist/llm/provider_format/openai.test.cjs +490 -0
  121. package/dist/llm/provider_format/openai.test.cjs.map +1 -0
  122. package/dist/llm/provider_format/openai.test.js +489 -0
  123. package/dist/llm/provider_format/openai.test.js.map +1 -0
  124. package/dist/llm/provider_format/utils.cjs +146 -0
  125. package/dist/llm/provider_format/utils.cjs.map +1 -0
  126. package/dist/llm/provider_format/utils.d.cts +38 -0
  127. package/dist/llm/provider_format/utils.d.ts +38 -0
  128. package/dist/llm/provider_format/utils.d.ts.map +1 -0
  129. package/dist/llm/provider_format/utils.js +122 -0
  130. package/dist/llm/provider_format/utils.js.map +1 -0
  131. package/dist/llm/realtime.cjs +77 -0
  132. package/dist/llm/realtime.cjs.map +1 -0
  133. package/dist/llm/realtime.d.cts +98 -0
  134. package/dist/llm/realtime.d.ts +98 -0
  135. package/dist/llm/realtime.d.ts.map +1 -0
  136. package/dist/llm/realtime.js +52 -0
  137. package/dist/llm/realtime.js.map +1 -0
  138. package/dist/llm/remote_chat_context.cjs +112 -0
  139. package/dist/llm/remote_chat_context.cjs.map +1 -0
  140. package/dist/llm/remote_chat_context.d.cts +23 -0
  141. package/dist/llm/remote_chat_context.d.ts +23 -0
  142. package/dist/llm/remote_chat_context.d.ts.map +1 -0
  143. package/dist/llm/remote_chat_context.js +88 -0
  144. package/dist/llm/remote_chat_context.js.map +1 -0
  145. package/dist/llm/remote_chat_context.test.cjs +225 -0
  146. package/dist/llm/remote_chat_context.test.cjs.map +1 -0
  147. package/dist/llm/remote_chat_context.test.js +224 -0
  148. package/dist/llm/remote_chat_context.test.js.map +1 -0
  149. package/dist/llm/tool_context.cjs +111 -0
  150. package/dist/llm/tool_context.cjs.map +1 -0
  151. package/dist/llm/tool_context.d.cts +125 -0
  152. package/dist/llm/tool_context.d.ts +125 -0
  153. package/dist/llm/tool_context.d.ts.map +1 -0
  154. package/dist/llm/tool_context.js +80 -0
  155. package/dist/llm/tool_context.js.map +1 -0
  156. package/dist/llm/tool_context.test.cjs +162 -0
  157. package/dist/llm/tool_context.test.cjs.map +1 -0
  158. package/dist/llm/tool_context.test.js +161 -0
  159. package/dist/llm/tool_context.test.js.map +1 -0
  160. package/dist/llm/tool_context.type.test.cjs +92 -0
  161. package/dist/llm/tool_context.type.test.cjs.map +1 -0
  162. package/dist/llm/tool_context.type.test.js +91 -0
  163. package/dist/llm/tool_context.type.test.js.map +1 -0
  164. package/dist/llm/utils.cjs +260 -0
  165. package/dist/llm/utils.cjs.map +1 -0
  166. package/dist/llm/utils.d.cts +42 -0
  167. package/dist/llm/utils.d.ts +42 -0
  168. package/dist/llm/utils.d.ts.map +1 -0
  169. package/dist/llm/utils.js +223 -0
  170. package/dist/llm/utils.js.map +1 -0
  171. package/dist/llm/utils.test.cjs +513 -0
  172. package/dist/llm/utils.test.cjs.map +1 -0
  173. package/dist/llm/utils.test.js +490 -0
  174. package/dist/llm/utils.test.js.map +1 -0
  175. package/dist/metrics/base.cjs +0 -27
  176. package/dist/metrics/base.cjs.map +1 -1
  177. package/dist/metrics/base.d.cts +105 -63
  178. package/dist/metrics/base.d.ts +105 -63
  179. package/dist/metrics/base.d.ts.map +1 -1
  180. package/dist/metrics/base.js +0 -19
  181. package/dist/metrics/base.js.map +1 -1
  182. package/dist/metrics/index.cjs +0 -3
  183. package/dist/metrics/index.cjs.map +1 -1
  184. package/dist/metrics/index.d.cts +2 -3
  185. package/dist/metrics/index.d.ts +2 -3
  186. package/dist/metrics/index.d.ts.map +1 -1
  187. package/dist/metrics/index.js +0 -2
  188. package/dist/metrics/index.js.map +1 -1
  189. package/dist/metrics/usage_collector.cjs +17 -12
  190. package/dist/metrics/usage_collector.cjs.map +1 -1
  191. package/dist/metrics/usage_collector.d.cts +3 -2
  192. package/dist/metrics/usage_collector.d.ts +3 -2
  193. package/dist/metrics/usage_collector.d.ts.map +1 -1
  194. package/dist/metrics/usage_collector.js +17 -12
  195. package/dist/metrics/usage_collector.js.map +1 -1
  196. package/dist/metrics/utils.cjs +22 -59
  197. package/dist/metrics/utils.cjs.map +1 -1
  198. package/dist/metrics/utils.d.cts +1 -8
  199. package/dist/metrics/utils.d.ts +1 -8
  200. package/dist/metrics/utils.d.ts.map +1 -1
  201. package/dist/metrics/utils.js +22 -52
  202. package/dist/metrics/utils.js.map +1 -1
  203. package/dist/multimodal/index.cjs +0 -2
  204. package/dist/multimodal/index.cjs.map +1 -1
  205. package/dist/multimodal/index.d.cts +0 -1
  206. package/dist/multimodal/index.d.ts +0 -1
  207. package/dist/multimodal/index.d.ts.map +1 -1
  208. package/dist/multimodal/index.js +0 -1
  209. package/dist/multimodal/index.js.map +1 -1
  210. package/dist/plugin.cjs +24 -8
  211. package/dist/plugin.cjs.map +1 -1
  212. package/dist/plugin.d.cts +18 -4
  213. package/dist/plugin.d.ts +18 -4
  214. package/dist/plugin.d.ts.map +1 -1
  215. package/dist/plugin.js +22 -7
  216. package/dist/plugin.js.map +1 -1
  217. package/dist/stream/deferred_stream.cjs +98 -0
  218. package/dist/stream/deferred_stream.cjs.map +1 -0
  219. package/dist/stream/deferred_stream.d.cts +27 -0
  220. package/dist/stream/deferred_stream.d.ts +27 -0
  221. package/dist/stream/deferred_stream.d.ts.map +1 -0
  222. package/dist/stream/deferred_stream.js +73 -0
  223. package/dist/stream/deferred_stream.js.map +1 -0
  224. package/dist/stream/deferred_stream.test.cjs +527 -0
  225. package/dist/stream/deferred_stream.test.cjs.map +1 -0
  226. package/dist/stream/deferred_stream.test.js +526 -0
  227. package/dist/stream/deferred_stream.test.js.map +1 -0
  228. package/dist/stream/identity_transform.cjs +42 -0
  229. package/dist/stream/identity_transform.cjs.map +1 -0
  230. package/dist/stream/identity_transform.d.cts +6 -0
  231. package/dist/stream/identity_transform.d.ts +6 -0
  232. package/dist/stream/identity_transform.d.ts.map +1 -0
  233. package/dist/stream/identity_transform.js +18 -0
  234. package/dist/stream/identity_transform.js.map +1 -0
  235. package/dist/stream/identity_transform.test.cjs +125 -0
  236. package/dist/stream/identity_transform.test.cjs.map +1 -0
  237. package/dist/stream/identity_transform.test.js +124 -0
  238. package/dist/stream/identity_transform.test.js.map +1 -0
  239. package/dist/stream/index.cjs +38 -0
  240. package/dist/stream/index.cjs.map +1 -0
  241. package/dist/stream/index.d.cts +5 -0
  242. package/dist/stream/index.d.ts +5 -0
  243. package/dist/stream/index.d.ts.map +1 -0
  244. package/dist/stream/index.js +11 -0
  245. package/dist/stream/index.js.map +1 -0
  246. package/dist/stream/merge_readable_streams.cjs +59 -0
  247. package/dist/stream/merge_readable_streams.cjs.map +1 -0
  248. package/dist/stream/merge_readable_streams.d.cts +4 -0
  249. package/dist/stream/merge_readable_streams.d.ts +4 -0
  250. package/dist/stream/merge_readable_streams.d.ts.map +1 -0
  251. package/dist/stream/merge_readable_streams.js +35 -0
  252. package/dist/stream/merge_readable_streams.js.map +1 -0
  253. package/dist/stream/stream_channel.cjs +47 -0
  254. package/dist/stream/stream_channel.cjs.map +1 -0
  255. package/dist/stream/stream_channel.d.cts +9 -0
  256. package/dist/stream/stream_channel.d.ts +9 -0
  257. package/dist/stream/stream_channel.d.ts.map +1 -0
  258. package/dist/stream/stream_channel.js +23 -0
  259. package/dist/stream/stream_channel.js.map +1 -0
  260. package/dist/stream/stream_channel.test.cjs +97 -0
  261. package/dist/stream/stream_channel.test.cjs.map +1 -0
  262. package/dist/stream/stream_channel.test.js +96 -0
  263. package/dist/stream/stream_channel.test.js.map +1 -0
  264. package/dist/stt/stream_adapter.cjs +3 -4
  265. package/dist/stt/stream_adapter.cjs.map +1 -1
  266. package/dist/stt/stream_adapter.d.cts +1 -0
  267. package/dist/stt/stream_adapter.d.ts +1 -0
  268. package/dist/stt/stream_adapter.d.ts.map +1 -1
  269. package/dist/stt/stream_adapter.js +3 -4
  270. package/dist/stt/stream_adapter.js.map +1 -1
  271. package/dist/stt/stt.cjs +101 -10
  272. package/dist/stt/stt.cjs.map +1 -1
  273. package/dist/stt/stt.d.cts +26 -5
  274. package/dist/stt/stt.d.ts +26 -5
  275. package/dist/stt/stt.d.ts.map +1 -1
  276. package/dist/stt/stt.js +102 -11
  277. package/dist/stt/stt.js.map +1 -1
  278. package/dist/tokenize/basic/basic.cjs +10 -5
  279. package/dist/tokenize/basic/basic.cjs.map +1 -1
  280. package/dist/tokenize/basic/basic.d.cts +7 -1
  281. package/dist/tokenize/basic/basic.d.ts +7 -1
  282. package/dist/tokenize/basic/basic.d.ts.map +1 -1
  283. package/dist/tokenize/basic/basic.js +10 -5
  284. package/dist/tokenize/basic/basic.js.map +1 -1
  285. package/dist/tokenize/basic/sentence.cjs +14 -6
  286. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  287. package/dist/tokenize/basic/sentence.d.cts +1 -1
  288. package/dist/tokenize/basic/sentence.d.ts +1 -1
  289. package/dist/tokenize/basic/sentence.d.ts.map +1 -1
  290. package/dist/tokenize/basic/sentence.js +14 -6
  291. package/dist/tokenize/basic/sentence.js.map +1 -1
  292. package/dist/tokenize/token_stream.cjs +5 -3
  293. package/dist/tokenize/token_stream.cjs.map +1 -1
  294. package/dist/tokenize/token_stream.d.cts +1 -0
  295. package/dist/tokenize/token_stream.d.ts +1 -0
  296. package/dist/tokenize/token_stream.d.ts.map +1 -1
  297. package/dist/tokenize/token_stream.js +6 -4
  298. package/dist/tokenize/token_stream.js.map +1 -1
  299. package/dist/transcription.cjs +1 -2
  300. package/dist/transcription.cjs.map +1 -1
  301. package/dist/transcription.d.ts.map +1 -1
  302. package/dist/transcription.js +2 -3
  303. package/dist/transcription.js.map +1 -1
  304. package/dist/tts/index.cjs +2 -4
  305. package/dist/tts/index.cjs.map +1 -1
  306. package/dist/tts/index.d.cts +1 -1
  307. package/dist/tts/index.d.ts +1 -1
  308. package/dist/tts/index.d.ts.map +1 -1
  309. package/dist/tts/index.js +1 -3
  310. package/dist/tts/index.js.map +1 -1
  311. package/dist/tts/stream_adapter.cjs +26 -13
  312. package/dist/tts/stream_adapter.cjs.map +1 -1
  313. package/dist/tts/stream_adapter.d.cts +1 -1
  314. package/dist/tts/stream_adapter.d.ts +1 -1
  315. package/dist/tts/stream_adapter.d.ts.map +1 -1
  316. package/dist/tts/stream_adapter.js +27 -14
  317. package/dist/tts/stream_adapter.js.map +1 -1
  318. package/dist/tts/tts.cjs +157 -25
  319. package/dist/tts/tts.cjs.map +1 -1
  320. package/dist/tts/tts.d.cts +29 -5
  321. package/dist/tts/tts.d.ts +29 -5
  322. package/dist/tts/tts.d.ts.map +1 -1
  323. package/dist/tts/tts.js +157 -24
  324. package/dist/tts/tts.js.map +1 -1
  325. package/dist/types.cjs +60 -0
  326. package/dist/types.cjs.map +1 -0
  327. package/dist/types.d.cts +13 -0
  328. package/dist/types.d.ts +13 -0
  329. package/dist/types.d.ts.map +1 -0
  330. package/dist/types.js +35 -0
  331. package/dist/types.js.map +1 -0
  332. package/dist/utils.cjs +281 -27
  333. package/dist/utils.cjs.map +1 -1
  334. package/dist/utils.d.cts +134 -9
  335. package/dist/utils.d.ts +134 -9
  336. package/dist/utils.d.ts.map +1 -1
  337. package/dist/utils.js +265 -26
  338. package/dist/utils.js.map +1 -1
  339. package/dist/utils.test.cjs +492 -0
  340. package/dist/utils.test.cjs.map +1 -0
  341. package/dist/utils.test.js +498 -0
  342. package/dist/utils.test.js.map +1 -0
  343. package/dist/vad.cjs +76 -20
  344. package/dist/vad.cjs.map +1 -1
  345. package/dist/vad.d.cts +25 -5
  346. package/dist/vad.d.ts +25 -5
  347. package/dist/vad.d.ts.map +1 -1
  348. package/dist/vad.js +76 -20
  349. package/dist/vad.js.map +1 -1
  350. package/dist/voice/agent.cjs +245 -0
  351. package/dist/voice/agent.cjs.map +1 -0
  352. package/dist/voice/agent.d.cts +78 -0
  353. package/dist/voice/agent.d.ts +78 -0
  354. package/dist/voice/agent.d.ts.map +1 -0
  355. package/dist/voice/agent.js +220 -0
  356. package/dist/voice/agent.js.map +1 -0
  357. package/dist/voice/agent.test.cjs +61 -0
  358. package/dist/voice/agent.test.cjs.map +1 -0
  359. package/dist/voice/agent.test.js +60 -0
  360. package/dist/voice/agent.test.js.map +1 -0
  361. package/dist/voice/agent_activity.cjs +1453 -0
  362. package/dist/voice/agent_activity.cjs.map +1 -0
  363. package/dist/voice/agent_activity.d.cts +94 -0
  364. package/dist/voice/agent_activity.d.ts +94 -0
  365. package/dist/voice/agent_activity.d.ts.map +1 -0
  366. package/dist/voice/agent_activity.js +1449 -0
  367. package/dist/voice/agent_activity.js.map +1 -0
  368. package/dist/voice/agent_session.cjs +312 -0
  369. package/dist/voice/agent_session.cjs.map +1 -0
  370. package/dist/voice/agent_session.d.cts +121 -0
  371. package/dist/voice/agent_session.d.ts +121 -0
  372. package/dist/voice/agent_session.d.ts.map +1 -0
  373. package/dist/voice/agent_session.js +295 -0
  374. package/dist/voice/agent_session.js.map +1 -0
  375. package/dist/voice/audio_recognition.cjs +375 -0
  376. package/dist/voice/audio_recognition.cjs.map +1 -0
  377. package/dist/voice/audio_recognition.d.cts +80 -0
  378. package/dist/voice/audio_recognition.d.ts +80 -0
  379. package/dist/voice/audio_recognition.d.ts.map +1 -0
  380. package/dist/voice/audio_recognition.js +351 -0
  381. package/dist/voice/audio_recognition.js.map +1 -0
  382. package/dist/voice/events.cjs +145 -0
  383. package/dist/voice/events.cjs.map +1 -0
  384. package/dist/voice/events.d.cts +124 -0
  385. package/dist/voice/events.d.ts +124 -0
  386. package/dist/voice/events.d.ts.map +1 -0
  387. package/dist/voice/events.js +110 -0
  388. package/dist/voice/events.js.map +1 -0
  389. package/dist/voice/generation.cjs +700 -0
  390. package/dist/voice/generation.cjs.map +1 -0
  391. package/dist/voice/generation.d.cts +115 -0
  392. package/dist/voice/generation.d.ts +115 -0
  393. package/dist/voice/generation.d.ts.map +1 -0
  394. package/dist/voice/generation.js +672 -0
  395. package/dist/voice/generation.js.map +1 -0
  396. package/dist/voice/index.cjs +40 -0
  397. package/dist/voice/index.cjs.map +1 -0
  398. package/dist/voice/index.d.cts +5 -0
  399. package/dist/voice/index.d.ts +5 -0
  400. package/dist/voice/index.d.ts.map +1 -0
  401. package/dist/voice/index.js +11 -0
  402. package/dist/voice/index.js.map +1 -0
  403. package/dist/voice/io.cjs +245 -0
  404. package/dist/voice/io.cjs.map +1 -0
  405. package/dist/voice/io.d.cts +101 -0
  406. package/dist/voice/io.d.ts +101 -0
  407. package/dist/voice/io.d.ts.map +1 -0
  408. package/dist/voice/io.js +217 -0
  409. package/dist/voice/io.js.map +1 -0
  410. package/dist/voice/room_io/_input.cjs +121 -0
  411. package/dist/voice/room_io/_input.cjs.map +1 -0
  412. package/dist/voice/room_io/_input.d.cts +24 -0
  413. package/dist/voice/room_io/_input.d.ts +24 -0
  414. package/dist/voice/room_io/_input.d.ts.map +1 -0
  415. package/dist/voice/room_io/_input.js +102 -0
  416. package/dist/voice/room_io/_input.js.map +1 -0
  417. package/dist/voice/room_io/_output.cjs +358 -0
  418. package/dist/voice/room_io/_output.cjs.map +1 -0
  419. package/dist/voice/room_io/_output.d.cts +75 -0
  420. package/dist/voice/room_io/_output.d.ts +75 -0
  421. package/dist/voice/room_io/_output.d.ts.map +1 -0
  422. package/dist/voice/room_io/_output.js +342 -0
  423. package/dist/voice/room_io/_output.js.map +1 -0
  424. package/dist/voice/room_io/index.cjs +25 -0
  425. package/dist/voice/room_io/index.cjs.map +1 -0
  426. package/dist/voice/room_io/index.d.cts +3 -0
  427. package/dist/voice/room_io/index.d.ts +3 -0
  428. package/dist/voice/room_io/index.d.ts.map +1 -0
  429. package/dist/voice/room_io/index.js +3 -0
  430. package/dist/voice/room_io/index.js.map +1 -0
  431. package/dist/voice/room_io/room_io.cjs +370 -0
  432. package/dist/voice/room_io/room_io.cjs.map +1 -0
  433. package/dist/voice/room_io/room_io.d.cts +73 -0
  434. package/dist/voice/room_io/room_io.d.ts +73 -0
  435. package/dist/voice/room_io/room_io.d.ts.map +1 -0
  436. package/dist/voice/room_io/room_io.js +361 -0
  437. package/dist/voice/room_io/room_io.js.map +1 -0
  438. package/dist/{pipeline/index.cjs → voice/run_context.cjs} +16 -11
  439. package/dist/voice/run_context.cjs.map +1 -0
  440. package/dist/voice/run_context.d.cts +12 -0
  441. package/dist/voice/run_context.d.ts +12 -0
  442. package/dist/voice/run_context.d.ts.map +1 -0
  443. package/dist/voice/run_context.js +14 -0
  444. package/dist/voice/run_context.js.map +1 -0
  445. package/dist/voice/speech_handle.cjs +105 -0
  446. package/dist/voice/speech_handle.cjs.map +1 -0
  447. package/dist/voice/speech_handle.d.cts +46 -0
  448. package/dist/voice/speech_handle.d.ts +46 -0
  449. package/dist/voice/speech_handle.d.ts.map +1 -0
  450. package/dist/voice/speech_handle.js +81 -0
  451. package/dist/voice/speech_handle.js.map +1 -0
  452. package/dist/voice/transcription/_utils.cjs +45 -0
  453. package/dist/voice/transcription/_utils.cjs.map +1 -0
  454. package/dist/voice/transcription/_utils.d.cts +3 -0
  455. package/dist/voice/transcription/_utils.d.ts +3 -0
  456. package/dist/voice/transcription/_utils.d.ts.map +1 -0
  457. package/dist/voice/transcription/_utils.js +21 -0
  458. package/dist/voice/transcription/_utils.js.map +1 -0
  459. package/dist/voice/transcription/index.cjs +23 -0
  460. package/dist/voice/transcription/index.cjs.map +1 -0
  461. package/dist/voice/transcription/index.d.cts +2 -0
  462. package/dist/voice/transcription/index.d.ts +2 -0
  463. package/dist/voice/transcription/index.d.ts.map +1 -0
  464. package/dist/voice/transcription/index.js +2 -0
  465. package/dist/voice/transcription/index.js.map +1 -0
  466. package/dist/voice/transcription/synchronizer.cjs +380 -0
  467. package/dist/voice/transcription/synchronizer.cjs.map +1 -0
  468. package/dist/voice/transcription/synchronizer.d.cts +86 -0
  469. package/dist/voice/transcription/synchronizer.d.ts +86 -0
  470. package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
  471. package/dist/voice/transcription/synchronizer.js +355 -0
  472. package/dist/voice/transcription/synchronizer.js.map +1 -0
  473. package/dist/worker.cjs +22 -4
  474. package/dist/worker.cjs.map +1 -1
  475. package/dist/worker.d.cts +1 -1
  476. package/dist/worker.d.ts +1 -1
  477. package/dist/worker.d.ts.map +1 -1
  478. package/dist/worker.js +22 -4
  479. package/dist/worker.js.map +1 -1
  480. package/package.json +9 -2
  481. package/src/_exceptions.ts +137 -0
  482. package/src/audio.ts +12 -1
  483. package/src/cli.ts +37 -0
  484. package/src/constants.ts +2 -1
  485. package/src/http_server.ts +1 -0
  486. package/src/index.ts +13 -10
  487. package/src/inference_runner.ts +2 -3
  488. package/src/ipc/inference_proc_executor.ts +2 -2
  489. package/src/ipc/job_executor.ts +1 -1
  490. package/src/ipc/job_proc_executor.ts +1 -1
  491. package/src/ipc/job_proc_lazy_main.ts +1 -1
  492. package/src/job.ts +18 -0
  493. package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
  494. package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
  495. package/src/llm/__snapshots__/utils.test.ts.snap +65 -0
  496. package/src/llm/chat_context.test.ts +450 -0
  497. package/src/llm/chat_context.ts +501 -103
  498. package/src/llm/index.ts +53 -18
  499. package/src/llm/llm.ts +149 -50
  500. package/src/llm/provider_format/google.test.ts +772 -0
  501. package/src/llm/provider_format/google.ts +130 -0
  502. package/src/llm/provider_format/index.ts +23 -0
  503. package/src/llm/provider_format/openai.test.ts +581 -0
  504. package/src/llm/provider_format/openai.ts +118 -0
  505. package/src/llm/provider_format/utils.ts +183 -0
  506. package/src/llm/realtime.ts +151 -0
  507. package/src/llm/remote_chat_context.test.ts +290 -0
  508. package/src/llm/remote_chat_context.ts +114 -0
  509. package/src/llm/tool_context.test.ts +198 -0
  510. package/src/llm/tool_context.ts +259 -0
  511. package/src/llm/tool_context.type.test.ts +115 -0
  512. package/src/llm/utils.test.ts +670 -0
  513. package/src/llm/utils.ts +324 -0
  514. package/src/metrics/base.ts +110 -78
  515. package/src/metrics/index.ts +3 -9
  516. package/src/metrics/usage_collector.ts +19 -13
  517. package/src/metrics/utils.ts +24 -69
  518. package/src/multimodal/index.ts +0 -1
  519. package/src/plugin.ts +26 -8
  520. package/src/stream/deferred_stream.test.ts +755 -0
  521. package/src/stream/deferred_stream.ts +110 -0
  522. package/src/stream/identity_transform.test.ts +179 -0
  523. package/src/stream/identity_transform.ts +18 -0
  524. package/src/stream/index.ts +7 -0
  525. package/src/stream/merge_readable_streams.ts +40 -0
  526. package/src/stream/stream_channel.test.ts +129 -0
  527. package/src/stream/stream_channel.ts +32 -0
  528. package/src/stt/stream_adapter.ts +3 -5
  529. package/src/stt/stt.ts +135 -17
  530. package/src/tokenize/basic/basic.ts +13 -5
  531. package/src/tokenize/basic/sentence.ts +20 -6
  532. package/src/tokenize/token_stream.ts +7 -4
  533. package/src/transcription.ts +2 -3
  534. package/src/tts/index.ts +0 -1
  535. package/src/tts/stream_adapter.ts +42 -16
  536. package/src/tts/tts.ts +203 -21
  537. package/src/types.ts +42 -0
  538. package/src/utils.test.ts +658 -0
  539. package/src/utils.ts +375 -44
  540. package/src/vad.ts +90 -22
  541. package/src/voice/agent.test.ts +80 -0
  542. package/src/voice/agent.ts +332 -0
  543. package/src/voice/agent_activity.ts +1913 -0
  544. package/src/voice/agent_session.ts +460 -0
  545. package/src/voice/audio_recognition.ts +474 -0
  546. package/src/voice/events.ts +252 -0
  547. package/src/voice/generation.ts +881 -0
  548. package/src/voice/index.ts +7 -0
  549. package/src/voice/io.ts +304 -0
  550. package/src/voice/room_io/_input.ts +144 -0
  551. package/src/voice/room_io/_output.ts +436 -0
  552. package/src/voice/room_io/index.ts +5 -0
  553. package/src/voice/room_io/room_io.ts +495 -0
  554. package/src/voice/run_context.ts +20 -0
  555. package/src/voice/speech_handle.ts +104 -0
  556. package/src/voice/transcription/_utils.ts +25 -0
  557. package/src/voice/transcription/index.ts +4 -0
  558. package/src/voice/transcription/synchronizer.ts +478 -0
  559. package/src/worker.ts +22 -2
  560. package/dist/llm/function_context.cjs +0 -103
  561. package/dist/llm/function_context.cjs.map +0 -1
  562. package/dist/llm/function_context.d.cts +0 -47
  563. package/dist/llm/function_context.d.ts +0 -47
  564. package/dist/llm/function_context.d.ts.map +0 -1
  565. package/dist/llm/function_context.js +0 -78
  566. package/dist/llm/function_context.js.map +0 -1
  567. package/dist/llm/function_context.test.cjs +0 -218
  568. package/dist/llm/function_context.test.cjs.map +0 -1
  569. package/dist/llm/function_context.test.js +0 -217
  570. package/dist/llm/function_context.test.js.map +0 -1
  571. package/dist/multimodal/multimodal_agent.cjs +0 -486
  572. package/dist/multimodal/multimodal_agent.cjs.map +0 -1
  573. package/dist/multimodal/multimodal_agent.d.cts +0 -48
  574. package/dist/multimodal/multimodal_agent.d.ts +0 -48
  575. package/dist/multimodal/multimodal_agent.d.ts.map +0 -1
  576. package/dist/multimodal/multimodal_agent.js +0 -461
  577. package/dist/multimodal/multimodal_agent.js.map +0 -1
  578. package/dist/pipeline/agent_output.cjs +0 -197
  579. package/dist/pipeline/agent_output.cjs.map +0 -1
  580. package/dist/pipeline/agent_output.d.cts +0 -33
  581. package/dist/pipeline/agent_output.d.ts +0 -33
  582. package/dist/pipeline/agent_output.d.ts.map +0 -1
  583. package/dist/pipeline/agent_output.js +0 -172
  584. package/dist/pipeline/agent_output.js.map +0 -1
  585. package/dist/pipeline/agent_playout.cjs +0 -175
  586. package/dist/pipeline/agent_playout.cjs.map +0 -1
  587. package/dist/pipeline/agent_playout.d.cts +0 -40
  588. package/dist/pipeline/agent_playout.d.ts +0 -40
  589. package/dist/pipeline/agent_playout.d.ts.map +0 -1
  590. package/dist/pipeline/agent_playout.js +0 -139
  591. package/dist/pipeline/agent_playout.js.map +0 -1
  592. package/dist/pipeline/human_input.cjs +0 -171
  593. package/dist/pipeline/human_input.cjs.map +0 -1
  594. package/dist/pipeline/human_input.d.cts +0 -30
  595. package/dist/pipeline/human_input.d.ts +0 -30
  596. package/dist/pipeline/human_input.d.ts.map +0 -1
  597. package/dist/pipeline/human_input.js +0 -146
  598. package/dist/pipeline/human_input.js.map +0 -1
  599. package/dist/pipeline/index.cjs.map +0 -1
  600. package/dist/pipeline/index.d.cts +0 -2
  601. package/dist/pipeline/index.d.ts +0 -2
  602. package/dist/pipeline/index.d.ts.map +0 -1
  603. package/dist/pipeline/index.js +0 -11
  604. package/dist/pipeline/index.js.map +0 -1
  605. package/dist/pipeline/pipeline_agent.cjs +0 -859
  606. package/dist/pipeline/pipeline_agent.cjs.map +0 -1
  607. package/dist/pipeline/pipeline_agent.d.cts +0 -150
  608. package/dist/pipeline/pipeline_agent.d.ts +0 -150
  609. package/dist/pipeline/pipeline_agent.d.ts.map +0 -1
  610. package/dist/pipeline/pipeline_agent.js +0 -837
  611. package/dist/pipeline/pipeline_agent.js.map +0 -1
  612. package/dist/pipeline/speech_handle.cjs +0 -176
  613. package/dist/pipeline/speech_handle.cjs.map +0 -1
  614. package/dist/pipeline/speech_handle.d.cts +0 -37
  615. package/dist/pipeline/speech_handle.d.ts +0 -37
  616. package/dist/pipeline/speech_handle.d.ts.map +0 -1
  617. package/dist/pipeline/speech_handle.js +0 -152
  618. package/dist/pipeline/speech_handle.js.map +0 -1
  619. package/src/llm/function_context.test.ts +0 -248
  620. package/src/llm/function_context.ts +0 -142
  621. package/src/multimodal/multimodal_agent.ts +0 -592
  622. package/src/pipeline/agent_output.ts +0 -219
  623. package/src/pipeline/agent_playout.ts +0 -192
  624. package/src/pipeline/human_input.ts +0 -188
  625. package/src/pipeline/index.ts +0 -15
  626. package/src/pipeline/pipeline_agent.ts +0 -1197
  627. package/src/pipeline/speech_handle.ts +0 -201
@@ -0,0 +1,80 @@
1
+ import { ZodObject, ZodType, z } from "zod";
2
+ const TOOL_SYMBOL = Symbol("tool");
3
+ const FUNCTION_TOOL_SYMBOL = Symbol("function_tool");
4
+ const PROVIDER_DEFINED_TOOL_SYMBOL = Symbol("provider_defined_tool");
5
+ const TOOL_ERROR_SYMBOL = Symbol("tool_error");
6
+ const HANDOFF_SYMBOL = Symbol("handoff");
7
+ class ToolError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ Object.defineProperty(this, TOOL_ERROR_SYMBOL, {
11
+ value: true
12
+ });
13
+ }
14
+ }
15
+ function handoff(options) {
16
+ return {
17
+ agent: options.agent,
18
+ returns: options.returns,
19
+ [HANDOFF_SYMBOL]: true
20
+ };
21
+ }
22
+ function tool(tool2) {
23
+ if (tool2.execute !== void 0) {
24
+ const parameters = tool2.parameters ?? z.object({});
25
+ if (parameters instanceof ZodType && parameters._def.typeName !== "ZodObject") {
26
+ throw new Error("Tool parameters must be a Zod object schema (z.object(...))");
27
+ }
28
+ if (!(parameters instanceof ZodObject) && !(typeof parameters === "object")) {
29
+ throw new Error("Tool parameters must be a Zod object schema or a raw JSON schema");
30
+ }
31
+ return {
32
+ type: "function",
33
+ description: tool2.description,
34
+ parameters,
35
+ execute: tool2.execute,
36
+ [TOOL_SYMBOL]: true,
37
+ [FUNCTION_TOOL_SYMBOL]: true
38
+ };
39
+ }
40
+ if (tool2.config !== void 0 && tool2.id !== void 0) {
41
+ return {
42
+ type: "provider-defined",
43
+ id: tool2.id,
44
+ config: tool2.config,
45
+ [TOOL_SYMBOL]: true,
46
+ [PROVIDER_DEFINED_TOOL_SYMBOL]: true
47
+ };
48
+ }
49
+ throw new Error("Invalid tool");
50
+ }
51
+ function isTool(tool2) {
52
+ return tool2 && tool2[TOOL_SYMBOL] === true;
53
+ }
54
+ function isFunctionTool(tool2) {
55
+ const isTool2 = tool2 && tool2[TOOL_SYMBOL] === true;
56
+ const isFunctionTool2 = tool2[FUNCTION_TOOL_SYMBOL] === true;
57
+ return isTool2 && isFunctionTool2;
58
+ }
59
+ function isProviderDefinedTool(tool2) {
60
+ const isTool2 = tool2 && tool2[TOOL_SYMBOL] === true;
61
+ const isProviderDefinedTool2 = tool2[PROVIDER_DEFINED_TOOL_SYMBOL] === true;
62
+ return isTool2 && isProviderDefinedTool2;
63
+ }
64
+ function isToolError(error) {
65
+ return error && error[TOOL_ERROR_SYMBOL] === true;
66
+ }
67
+ function isAgentHandoff(handoff2) {
68
+ return handoff2 && handoff2[HANDOFF_SYMBOL] === true;
69
+ }
70
+ export {
71
+ ToolError,
72
+ handoff,
73
+ isAgentHandoff,
74
+ isFunctionTool,
75
+ isProviderDefinedTool,
76
+ isTool,
77
+ isToolError,
78
+ tool
79
+ };
80
+ //# sourceMappingURL=tool_context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/llm/tool_context.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { ZodObject, ZodType, z } from 'zod';\nimport type { Agent } from '../voice/agent.js';\nimport type { RunContext, UnknownUserData } from '../voice/run_context.js';\n\n// heavily inspired by Vercel AI's `tool()`:\n// https://github.com/vercel/ai/blob/3b0983b/packages/ai/core/tool/tool.ts\n\nconst TOOL_SYMBOL = Symbol('tool');\nconst FUNCTION_TOOL_SYMBOL = Symbol('function_tool');\nconst PROVIDER_DEFINED_TOOL_SYMBOL = Symbol('provider_defined_tool');\nconst TOOL_ERROR_SYMBOL = Symbol('tool_error');\nconst HANDOFF_SYMBOL = Symbol('handoff');\n\nexport type JSONValue = null | string | number | boolean | JSONObject | JSONArray;\n\nexport type JSONArray = JSONValue[];\n\nexport type JSONObject = {\n [key: string]: JSONValue;\n};\n\n// TODO(AJS-111): support Zod cross-version compatibility, raw JSON schema, both strict and non-strict versions\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ToolInputSchema<T extends JSONObject> = ZodObject<any, any, any, T, T> | JSONSchema7;\n\nexport type ToolType = 'function' | 'provider-defined';\n\nexport type ToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | {\n type: 'function';\n function: {\n name: string;\n };\n };\n\nexport class ToolError extends Error {\n constructor(message: string) {\n super(message);\n\n Object.defineProperty(this, TOOL_ERROR_SYMBOL, {\n value: true,\n });\n }\n}\n\nexport interface AgentHandoff {\n /**\n * The agent to handoff to.\n */\n agent: Agent;\n\n /**\n * The return value of the tool.\n */\n returns?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n [HANDOFF_SYMBOL]: true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handoff(options: { agent: Agent; returns?: any }): AgentHandoff {\n return {\n agent: options.agent,\n returns: options.returns,\n [HANDOFF_SYMBOL]: true,\n };\n}\n\nexport interface ToolOptions<UserData = UnknownUserData> {\n /**\n * RunContext for the current agent session.\n */\n ctx: RunContext<UserData>;\n\n /**\n * The ID of the tool call.\n */\n toolCallId: string;\n\n /**\n * An optional abort signal that indicates that the overall operation should be aborted.\n */\n abortSignal?: AbortSignal;\n}\n\nexport type ToolExecuteFunction<\n Parameters extends JSONObject,\n UserData = UnknownUserData,\n Result = unknown,\n> = (args: Parameters, opts: ToolOptions<UserData>) => Promise<Result>;\n\nexport interface Tool {\n /**\n * The type of the tool.\n * @internal Either user-defined core tool or provider-defined tool.\n */\n type: ToolType;\n\n [TOOL_SYMBOL]: true;\n}\n\n// TODO(AJS-112): support provider-defined tools\nexport interface ProviderDefinedTool extends Tool {\n type: 'provider-defined';\n\n /**\n * The ID of the tool.\n */\n id: string;\n\n /**\n * The configuration of the tool.\n */\n config: Record<string, unknown>;\n\n [PROVIDER_DEFINED_TOOL_SYMBOL]: true;\n}\n\nexport interface FunctionTool<\n Parameters extends JSONObject,\n UserData = UnknownUserData,\n Result = unknown,\n> extends Tool {\n type: 'function';\n\n /**\n * The description of the tool. Will be used by the language model to decide whether to use the tool.\n */\n description: string;\n\n /**\n * The schema of the input that the tool expects. The language model will use this to generate the input.\n * It is also used to validate the output of the language model.\n * Use descriptions to make the input understandable for the language model.\n */\n parameters: ToolInputSchema<Parameters>;\n\n /**\n * An async function that is called with the arguments from the tool call and produces a result.\n * It also carries context about current session, user-defined data, and the tool call id, etc.\n */\n execute: ToolExecuteFunction<Parameters, UserData, Result>;\n\n [FUNCTION_TOOL_SYMBOL]: true;\n}\n\n// TODO(AJS-112): support provider-defined tools in the future)\nexport type ToolContext<UserData = UnknownUserData> = {\n [name: string]: FunctionTool<any, UserData, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n};\n\n/**\n * Create a function tool.\n *\n * @param description - The description of the tool.\n * @param parameters - The schema of the input that the tool expects. If not provided, defaults to z.object({}).\n * @param execute - The function that is called with the arguments from the tool call and produces a result.\n */\nexport function tool<\n Parameters extends JSONObject = Record<string, never>,\n UserData = UnknownUserData,\n Result = unknown,\n>({\n description,\n parameters,\n execute,\n}: {\n description: string;\n parameters?: ToolInputSchema<Parameters>;\n execute: ToolExecuteFunction<Parameters, UserData, Result>;\n}): FunctionTool<Parameters, UserData, Result>;\n\n/**\n * Create a provider-defined tool.\n *\n * @param id - The ID of the tool.\n * @param config - The configuration of the tool.\n */\nexport function tool({\n id,\n config,\n}: {\n id: string;\n config: Record<string, unknown>;\n}): ProviderDefinedTool;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function tool(tool: any): any {\n if (tool.execute !== undefined) {\n // Default parameters to z.object({}) if not provided\n const parameters = tool.parameters ?? z.object({});\n\n // if parameters is not zod object, throw an error\n if (parameters instanceof ZodType && parameters._def.typeName !== 'ZodObject') {\n throw new Error('Tool parameters must be a Zod object schema (z.object(...))');\n }\n\n if (!(parameters instanceof ZodObject) && !(typeof parameters === 'object')) {\n throw new Error('Tool parameters must be a Zod object schema or a raw JSON schema');\n }\n\n return {\n type: 'function',\n description: tool.description,\n parameters,\n execute: tool.execute,\n [TOOL_SYMBOL]: true,\n [FUNCTION_TOOL_SYMBOL]: true,\n };\n }\n\n if (tool.config !== undefined && tool.id !== undefined) {\n return {\n type: 'provider-defined',\n id: tool.id,\n config: tool.config,\n [TOOL_SYMBOL]: true,\n [PROVIDER_DEFINED_TOOL_SYMBOL]: true,\n };\n }\n\n throw new Error('Invalid tool');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isTool(tool: any): tool is Tool {\n return tool && tool[TOOL_SYMBOL] === true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isFunctionTool(tool: any): tool is FunctionTool<any, any, any> {\n const isTool = tool && tool[TOOL_SYMBOL] === true;\n const isFunctionTool = tool[FUNCTION_TOOL_SYMBOL] === true;\n return isTool && isFunctionTool;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isProviderDefinedTool(tool: any): tool is ProviderDefinedTool {\n const isTool = tool && tool[TOOL_SYMBOL] === true;\n const isProviderDefinedTool = tool[PROVIDER_DEFINED_TOOL_SYMBOL] === true;\n return isTool && isProviderDefinedTool;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isToolError(error: any): error is ToolError {\n return error && error[TOOL_ERROR_SYMBOL] === true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isAgentHandoff(handoff: any): handoff is AgentHandoff {\n return handoff && handoff[HANDOFF_SYMBOL] === true;\n}\n"],"mappings":"AAIA,SAAS,WAAW,SAAS,SAAS;AAOtC,MAAM,cAAc,OAAO,MAAM;AACjC,MAAM,uBAAuB,OAAO,eAAe;AACnD,MAAM,+BAA+B,OAAO,uBAAuB;AACnE,MAAM,oBAAoB,OAAO,YAAY;AAC7C,MAAM,iBAAiB,OAAO,SAAS;AA2BhC,MAAM,kBAAkB,MAAM;AAAA,EACnC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AAEb,WAAO,eAAe,MAAM,mBAAmB;AAAA,MAC7C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAiBO,SAAS,QAAQ,SAAwD;AAC9E,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,CAAC,cAAc,GAAG;AAAA,EACpB;AACF;AAyHO,SAAS,KAAKA,OAAgB;AACnC,MAAIA,MAAK,YAAY,QAAW;AAE9B,UAAM,aAAaA,MAAK,cAAc,EAAE,OAAO,CAAC,CAAC;AAGjD,QAAI,sBAAsB,WAAW,WAAW,KAAK,aAAa,aAAa;AAC7E,YAAM,IAAI,MAAM,6DAA6D;AAAA,IAC/E;AAEA,QAAI,EAAE,sBAAsB,cAAc,EAAE,OAAO,eAAe,WAAW;AAC3E,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAaA,MAAK;AAAA,MAClB;AAAA,MACA,SAASA,MAAK;AAAA,MACd,CAAC,WAAW,GAAG;AAAA,MACf,CAAC,oBAAoB,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,MAAIA,MAAK,WAAW,UAAaA,MAAK,OAAO,QAAW;AACtD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAIA,MAAK;AAAA,MACT,QAAQA,MAAK;AAAA,MACb,CAAC,WAAW,GAAG;AAAA,MACf,CAAC,4BAA4B,GAAG;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,cAAc;AAChC;AAGO,SAAS,OAAOA,OAAyB;AAC9C,SAAOA,SAAQA,MAAK,WAAW,MAAM;AACvC;AAGO,SAAS,eAAeA,OAAgD;AAC7E,QAAMC,UAASD,SAAQA,MAAK,WAAW,MAAM;AAC7C,QAAME,kBAAiBF,MAAK,oBAAoB,MAAM;AACtD,SAAOC,WAAUC;AACnB;AAGO,SAAS,sBAAsBF,OAAwC;AAC5E,QAAMC,UAASD,SAAQA,MAAK,WAAW,MAAM;AAC7C,QAAMG,yBAAwBH,MAAK,4BAA4B,MAAM;AACrE,SAAOC,WAAUE;AACnB;AAGO,SAAS,YAAY,OAAgC;AAC1D,SAAO,SAAS,MAAM,iBAAiB,MAAM;AAC/C;AAGO,SAAS,eAAeC,UAAuC;AACpE,SAAOA,YAAWA,SAAQ,cAAc,MAAM;AAChD;","names":["tool","isTool","isFunctionTool","isProviderDefinedTool","handoff"]}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_zod = require("zod");
4
+ var import_tool_context = require("./tool_context.cjs");
5
+ var import_utils = require("./utils.cjs");
6
+ (0, import_vitest.describe)("Tool Context", () => {
7
+ (0, import_vitest.describe)("oaiParams", () => {
8
+ (0, import_vitest.it)("should handle basic object schema", () => {
9
+ const schema = import_zod.z.object({
10
+ name: import_zod.z.string().describe("The user name"),
11
+ age: import_zod.z.number().describe("The user age")
12
+ });
13
+ const result = (0, import_utils.oaiParams)(schema);
14
+ (0, import_vitest.expect)(result).toMatchSnapshot();
15
+ });
16
+ (0, import_vitest.it)("should handle enum fields", () => {
17
+ const schema = import_zod.z.object({
18
+ color: import_zod.z.enum(["red", "blue", "green"]).describe("Choose a color")
19
+ });
20
+ const result = (0, import_utils.oaiParams)(schema);
21
+ (0, import_vitest.expect)(result).toMatchSnapshot();
22
+ });
23
+ (0, import_vitest.it)("should handle array fields", () => {
24
+ const schema = import_zod.z.object({
25
+ tags: import_zod.z.array(import_zod.z.string()).describe("List of tags")
26
+ });
27
+ const result = (0, import_utils.oaiParams)(schema);
28
+ (0, import_vitest.expect)(result).toMatchSnapshot();
29
+ });
30
+ (0, import_vitest.it)("should handle array of enums", () => {
31
+ const schema = import_zod.z.object({
32
+ colors: import_zod.z.array(import_zod.z.enum(["red", "blue", "green"])).describe("List of colors")
33
+ });
34
+ const result = (0, import_utils.oaiParams)(schema);
35
+ (0, import_vitest.expect)(result).toMatchSnapshot();
36
+ });
37
+ (0, import_vitest.it)("should handle optional fields", () => {
38
+ const schema = import_zod.z.object({
39
+ name: import_zod.z.string().describe("The user name"),
40
+ age: import_zod.z.number().optional().describe("The user age")
41
+ });
42
+ const result = (0, import_utils.oaiParams)(schema);
43
+ (0, import_vitest.expect)(result).toMatchSnapshot();
44
+ });
45
+ (0, import_vitest.it)("should handle fields without descriptions", () => {
46
+ const schema = import_zod.z.object({
47
+ name: import_zod.z.string(),
48
+ age: import_zod.z.number()
49
+ });
50
+ const result = (0, import_utils.oaiParams)(schema);
51
+ (0, import_vitest.expect)(result).toMatchSnapshot();
52
+ });
53
+ });
54
+ (0, import_vitest.describe)("tool", () => {
55
+ (0, import_vitest.it)("should create and execute a basic core tool", async () => {
56
+ const getWeather = (0, import_tool_context.tool)({
57
+ description: "Get the weather for a given location",
58
+ parameters: import_zod.z.object({
59
+ location: import_zod.z.string()
60
+ }),
61
+ execute: async ({ location }, { ctx }) => {
62
+ return `The weather in ${location} is sunny, ${ctx.userData.name}`;
63
+ }
64
+ });
65
+ const result = await getWeather.execute(
66
+ { location: "San Francisco" },
67
+ (0, import_utils.createToolOptions)("123", { name: "John" })
68
+ );
69
+ (0, import_vitest.expect)(result).toBe("The weather in San Francisco is sunny, John");
70
+ });
71
+ (0, import_vitest.it)("should properly type a callable function", async () => {
72
+ const testFunction = (0, import_tool_context.tool)({
73
+ description: "Test function",
74
+ parameters: import_zod.z.object({
75
+ name: import_zod.z.string().describe("The user name"),
76
+ age: import_zod.z.number().describe("The user age")
77
+ }),
78
+ execute: async (args) => {
79
+ return `${args.name} is ${args.age} years old`;
80
+ }
81
+ });
82
+ const result = await testFunction.execute(
83
+ { name: "John", age: 30 },
84
+ (0, import_utils.createToolOptions)("123")
85
+ );
86
+ (0, import_vitest.expect)(result).toBe("John is 30 years old");
87
+ });
88
+ (0, import_vitest.it)("should handle async execution", async () => {
89
+ const testFunction = (0, import_tool_context.tool)({
90
+ description: "Async test function",
91
+ parameters: import_zod.z.object({
92
+ delay: import_zod.z.number().describe("Delay in milliseconds")
93
+ }),
94
+ execute: async (args) => {
95
+ await new Promise((resolve) => setTimeout(resolve, args.delay));
96
+ return args.delay;
97
+ }
98
+ });
99
+ const start = Date.now();
100
+ const result = await testFunction.execute({ delay: 100 }, (0, import_utils.createToolOptions)("123"));
101
+ const duration = Date.now() - start;
102
+ (0, import_vitest.expect)(result).toBe(100);
103
+ (0, import_vitest.expect)(duration).toBeGreaterThanOrEqual(95);
104
+ });
105
+ (0, import_vitest.describe)("nested array support", () => {
106
+ (0, import_vitest.it)("should handle nested array fields", () => {
107
+ const schema = import_zod.z.object({
108
+ items: import_zod.z.array(
109
+ import_zod.z.object({
110
+ name: import_zod.z.string().describe("the item name"),
111
+ modifiers: import_zod.z.array(
112
+ import_zod.z.object({
113
+ modifier_name: import_zod.z.string(),
114
+ modifier_value: import_zod.z.string()
115
+ })
116
+ ).describe("list of the modifiers applied on this item, such as size")
117
+ })
118
+ )
119
+ });
120
+ const result = (0, import_utils.oaiParams)(schema);
121
+ (0, import_vitest.expect)(result).toMatchSnapshot();
122
+ });
123
+ });
124
+ (0, import_vitest.describe)("optional parameters", () => {
125
+ (0, import_vitest.it)("should create a tool without parameters", async () => {
126
+ const simpleAction = (0, import_tool_context.tool)({
127
+ description: "Perform a simple action",
128
+ execute: async () => {
129
+ return "Action performed";
130
+ }
131
+ });
132
+ (0, import_vitest.expect)(simpleAction.type).toBe("function");
133
+ (0, import_vitest.expect)(simpleAction.description).toBe("Perform a simple action");
134
+ (0, import_vitest.expect)(simpleAction.parameters).toBeDefined();
135
+ (0, import_vitest.expect)(simpleAction.parameters._def.typeName).toBe("ZodObject");
136
+ const result = await simpleAction.execute({}, (0, import_utils.createToolOptions)("123"));
137
+ (0, import_vitest.expect)(result).toBe("Action performed");
138
+ });
139
+ (0, import_vitest.it)("should handle tools with context but no parameters", async () => {
140
+ const greetUser = (0, import_tool_context.tool)({
141
+ description: "Greet the current user",
142
+ execute: async (_, { ctx }) => {
143
+ return `Hello, ${ctx.userData.username}!`;
144
+ }
145
+ });
146
+ const result = await greetUser.execute({}, (0, import_utils.createToolOptions)("123", { username: "Alice" }));
147
+ (0, import_vitest.expect)(result).toBe("Hello, Alice!");
148
+ });
149
+ (0, import_vitest.it)("should create a tool that accesses tool call id without parameters", async () => {
150
+ const getCallId = (0, import_tool_context.tool)({
151
+ description: "Get the current tool call ID",
152
+ execute: async (_, { toolCallId }) => {
153
+ return `Tool call ID: ${toolCallId}`;
154
+ }
155
+ });
156
+ const result = await getCallId.execute({}, (0, import_utils.createToolOptions)("test-id-456"));
157
+ (0, import_vitest.expect)(result).toBe("Tool call ID: test-id-456");
158
+ });
159
+ });
160
+ });
161
+ });
162
+ //# sourceMappingURL=tool_context.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/llm/tool_context.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { z } from 'zod';\nimport { type ToolOptions, tool } from './tool_context.js';\nimport { createToolOptions, oaiParams } from './utils.js';\n\ndescribe('Tool Context', () => {\n describe('oaiParams', () => {\n it('should handle basic object schema', () => {\n const schema = z.object({\n name: z.string().describe('The user name'),\n age: z.number().describe('The user age'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle enum fields', () => {\n const schema = z.object({\n color: z.enum(['red', 'blue', 'green']).describe('Choose a color'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle array fields', () => {\n const schema = z.object({\n tags: z.array(z.string()).describe('List of tags'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle array of enums', () => {\n const schema = z.object({\n colors: z.array(z.enum(['red', 'blue', 'green'])).describe('List of colors'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle optional fields', () => {\n const schema = z.object({\n name: z.string().describe('The user name'),\n age: z.number().optional().describe('The user age'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle fields without descriptions', () => {\n const schema = z.object({\n name: z.string(),\n age: z.number(),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('tool', () => {\n it('should create and execute a basic core tool', async () => {\n const getWeather = tool({\n description: 'Get the weather for a given location',\n parameters: z.object({\n location: z.string(),\n }),\n execute: async ({ location }, { ctx }: ToolOptions<{ name: string }>) => {\n return `The weather in ${location} is sunny, ${ctx.userData.name}`;\n },\n });\n\n const result = await getWeather.execute(\n { location: 'San Francisco' },\n createToolOptions('123', { name: 'John' }),\n );\n expect(result).toBe('The weather in San Francisco is sunny, John');\n });\n\n it('should properly type a callable function', async () => {\n const testFunction = tool({\n description: 'Test function',\n parameters: z.object({\n name: z.string().describe('The user name'),\n age: z.number().describe('The user age'),\n }),\n execute: async (args) => {\n return `${args.name} is ${args.age} years old`;\n },\n });\n\n const result = await testFunction.execute(\n { name: 'John', age: 30 },\n createToolOptions('123'),\n );\n expect(result).toBe('John is 30 years old');\n });\n\n it('should handle async execution', async () => {\n const testFunction = tool({\n description: 'Async test function',\n parameters: z.object({\n delay: z.number().describe('Delay in milliseconds'),\n }),\n execute: async (args) => {\n await new Promise((resolve) => setTimeout(resolve, args.delay));\n return args.delay;\n },\n });\n\n const start = Date.now();\n const result = await testFunction.execute({ delay: 100 }, createToolOptions('123'));\n const duration = Date.now() - start;\n\n expect(result).toBe(100);\n expect(duration).toBeGreaterThanOrEqual(95); // Allow for small timing variations\n });\n\n describe('nested array support', () => {\n it('should handle nested array fields', () => {\n const schema = z.object({\n items: z.array(\n z.object({\n name: z.string().describe('the item name'),\n modifiers: z\n .array(\n z.object({\n modifier_name: z.string(),\n modifier_value: z.string(),\n }),\n )\n .describe('list of the modifiers applied on this item, such as size'),\n }),\n ),\n });\n const result = oaiParams(schema);\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('optional parameters', () => {\n it('should create a tool without parameters', async () => {\n const simpleAction = tool({\n description: 'Perform a simple action',\n execute: async () => {\n return 'Action performed';\n },\n });\n\n expect(simpleAction.type).toBe('function');\n expect(simpleAction.description).toBe('Perform a simple action');\n expect(simpleAction.parameters).toBeDefined();\n expect(simpleAction.parameters._def.typeName).toBe('ZodObject');\n\n const result = await simpleAction.execute({}, createToolOptions('123'));\n expect(result).toBe('Action performed');\n });\n\n it('should handle tools with context but no parameters', async () => {\n const greetUser = tool({\n description: 'Greet the current user',\n execute: async (_, { ctx }: ToolOptions<{ username: string }>) => {\n return `Hello, ${ctx.userData.username}!`;\n },\n });\n\n const result = await greetUser.execute({}, createToolOptions('123', { username: 'Alice' }));\n expect(result).toBe('Hello, Alice!');\n });\n\n it('should create a tool that accesses tool call id without parameters', async () => {\n const getCallId = tool({\n description: 'Get the current tool call ID',\n execute: async (_, { toolCallId }) => {\n return `Tool call ID: ${toolCallId}`;\n },\n });\n\n const result = await getCallId.execute({}, createToolOptions('test-id-456'));\n expect(result).toBe('Tool call ID: test-id-456');\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,161 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { z } from "zod";
3
+ import { tool } from "./tool_context.js";
4
+ import { createToolOptions, oaiParams } from "./utils.js";
5
+ describe("Tool Context", () => {
6
+ describe("oaiParams", () => {
7
+ it("should handle basic object schema", () => {
8
+ const schema = z.object({
9
+ name: z.string().describe("The user name"),
10
+ age: z.number().describe("The user age")
11
+ });
12
+ const result = oaiParams(schema);
13
+ expect(result).toMatchSnapshot();
14
+ });
15
+ it("should handle enum fields", () => {
16
+ const schema = z.object({
17
+ color: z.enum(["red", "blue", "green"]).describe("Choose a color")
18
+ });
19
+ const result = oaiParams(schema);
20
+ expect(result).toMatchSnapshot();
21
+ });
22
+ it("should handle array fields", () => {
23
+ const schema = z.object({
24
+ tags: z.array(z.string()).describe("List of tags")
25
+ });
26
+ const result = oaiParams(schema);
27
+ expect(result).toMatchSnapshot();
28
+ });
29
+ it("should handle array of enums", () => {
30
+ const schema = z.object({
31
+ colors: z.array(z.enum(["red", "blue", "green"])).describe("List of colors")
32
+ });
33
+ const result = oaiParams(schema);
34
+ expect(result).toMatchSnapshot();
35
+ });
36
+ it("should handle optional fields", () => {
37
+ const schema = z.object({
38
+ name: z.string().describe("The user name"),
39
+ age: z.number().optional().describe("The user age")
40
+ });
41
+ const result = oaiParams(schema);
42
+ expect(result).toMatchSnapshot();
43
+ });
44
+ it("should handle fields without descriptions", () => {
45
+ const schema = z.object({
46
+ name: z.string(),
47
+ age: z.number()
48
+ });
49
+ const result = oaiParams(schema);
50
+ expect(result).toMatchSnapshot();
51
+ });
52
+ });
53
+ describe("tool", () => {
54
+ it("should create and execute a basic core tool", async () => {
55
+ const getWeather = tool({
56
+ description: "Get the weather for a given location",
57
+ parameters: z.object({
58
+ location: z.string()
59
+ }),
60
+ execute: async ({ location }, { ctx }) => {
61
+ return `The weather in ${location} is sunny, ${ctx.userData.name}`;
62
+ }
63
+ });
64
+ const result = await getWeather.execute(
65
+ { location: "San Francisco" },
66
+ createToolOptions("123", { name: "John" })
67
+ );
68
+ expect(result).toBe("The weather in San Francisco is sunny, John");
69
+ });
70
+ it("should properly type a callable function", async () => {
71
+ const testFunction = tool({
72
+ description: "Test function",
73
+ parameters: z.object({
74
+ name: z.string().describe("The user name"),
75
+ age: z.number().describe("The user age")
76
+ }),
77
+ execute: async (args) => {
78
+ return `${args.name} is ${args.age} years old`;
79
+ }
80
+ });
81
+ const result = await testFunction.execute(
82
+ { name: "John", age: 30 },
83
+ createToolOptions("123")
84
+ );
85
+ expect(result).toBe("John is 30 years old");
86
+ });
87
+ it("should handle async execution", async () => {
88
+ const testFunction = tool({
89
+ description: "Async test function",
90
+ parameters: z.object({
91
+ delay: z.number().describe("Delay in milliseconds")
92
+ }),
93
+ execute: async (args) => {
94
+ await new Promise((resolve) => setTimeout(resolve, args.delay));
95
+ return args.delay;
96
+ }
97
+ });
98
+ const start = Date.now();
99
+ const result = await testFunction.execute({ delay: 100 }, createToolOptions("123"));
100
+ const duration = Date.now() - start;
101
+ expect(result).toBe(100);
102
+ expect(duration).toBeGreaterThanOrEqual(95);
103
+ });
104
+ describe("nested array support", () => {
105
+ it("should handle nested array fields", () => {
106
+ const schema = z.object({
107
+ items: z.array(
108
+ z.object({
109
+ name: z.string().describe("the item name"),
110
+ modifiers: z.array(
111
+ z.object({
112
+ modifier_name: z.string(),
113
+ modifier_value: z.string()
114
+ })
115
+ ).describe("list of the modifiers applied on this item, such as size")
116
+ })
117
+ )
118
+ });
119
+ const result = oaiParams(schema);
120
+ expect(result).toMatchSnapshot();
121
+ });
122
+ });
123
+ describe("optional parameters", () => {
124
+ it("should create a tool without parameters", async () => {
125
+ const simpleAction = tool({
126
+ description: "Perform a simple action",
127
+ execute: async () => {
128
+ return "Action performed";
129
+ }
130
+ });
131
+ expect(simpleAction.type).toBe("function");
132
+ expect(simpleAction.description).toBe("Perform a simple action");
133
+ expect(simpleAction.parameters).toBeDefined();
134
+ expect(simpleAction.parameters._def.typeName).toBe("ZodObject");
135
+ const result = await simpleAction.execute({}, createToolOptions("123"));
136
+ expect(result).toBe("Action performed");
137
+ });
138
+ it("should handle tools with context but no parameters", async () => {
139
+ const greetUser = tool({
140
+ description: "Greet the current user",
141
+ execute: async (_, { ctx }) => {
142
+ return `Hello, ${ctx.userData.username}!`;
143
+ }
144
+ });
145
+ const result = await greetUser.execute({}, createToolOptions("123", { username: "Alice" }));
146
+ expect(result).toBe("Hello, Alice!");
147
+ });
148
+ it("should create a tool that accesses tool call id without parameters", async () => {
149
+ const getCallId = tool({
150
+ description: "Get the current tool call ID",
151
+ execute: async (_, { toolCallId }) => {
152
+ return `Tool call ID: ${toolCallId}`;
153
+ }
154
+ });
155
+ const result = await getCallId.execute({}, createToolOptions("test-id-456"));
156
+ expect(result).toBe("Tool call ID: test-id-456");
157
+ });
158
+ });
159
+ });
160
+ });
161
+ //# sourceMappingURL=tool_context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/llm/tool_context.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { z } from 'zod';\nimport { type ToolOptions, tool } from './tool_context.js';\nimport { createToolOptions, oaiParams } from './utils.js';\n\ndescribe('Tool Context', () => {\n describe('oaiParams', () => {\n it('should handle basic object schema', () => {\n const schema = z.object({\n name: z.string().describe('The user name'),\n age: z.number().describe('The user age'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle enum fields', () => {\n const schema = z.object({\n color: z.enum(['red', 'blue', 'green']).describe('Choose a color'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle array fields', () => {\n const schema = z.object({\n tags: z.array(z.string()).describe('List of tags'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle array of enums', () => {\n const schema = z.object({\n colors: z.array(z.enum(['red', 'blue', 'green'])).describe('List of colors'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle optional fields', () => {\n const schema = z.object({\n name: z.string().describe('The user name'),\n age: z.number().optional().describe('The user age'),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n\n it('should handle fields without descriptions', () => {\n const schema = z.object({\n name: z.string(),\n age: z.number(),\n });\n\n const result = oaiParams(schema);\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('tool', () => {\n it('should create and execute a basic core tool', async () => {\n const getWeather = tool({\n description: 'Get the weather for a given location',\n parameters: z.object({\n location: z.string(),\n }),\n execute: async ({ location }, { ctx }: ToolOptions<{ name: string }>) => {\n return `The weather in ${location} is sunny, ${ctx.userData.name}`;\n },\n });\n\n const result = await getWeather.execute(\n { location: 'San Francisco' },\n createToolOptions('123', { name: 'John' }),\n );\n expect(result).toBe('The weather in San Francisco is sunny, John');\n });\n\n it('should properly type a callable function', async () => {\n const testFunction = tool({\n description: 'Test function',\n parameters: z.object({\n name: z.string().describe('The user name'),\n age: z.number().describe('The user age'),\n }),\n execute: async (args) => {\n return `${args.name} is ${args.age} years old`;\n },\n });\n\n const result = await testFunction.execute(\n { name: 'John', age: 30 },\n createToolOptions('123'),\n );\n expect(result).toBe('John is 30 years old');\n });\n\n it('should handle async execution', async () => {\n const testFunction = tool({\n description: 'Async test function',\n parameters: z.object({\n delay: z.number().describe('Delay in milliseconds'),\n }),\n execute: async (args) => {\n await new Promise((resolve) => setTimeout(resolve, args.delay));\n return args.delay;\n },\n });\n\n const start = Date.now();\n const result = await testFunction.execute({ delay: 100 }, createToolOptions('123'));\n const duration = Date.now() - start;\n\n expect(result).toBe(100);\n expect(duration).toBeGreaterThanOrEqual(95); // Allow for small timing variations\n });\n\n describe('nested array support', () => {\n it('should handle nested array fields', () => {\n const schema = z.object({\n items: z.array(\n z.object({\n name: z.string().describe('the item name'),\n modifiers: z\n .array(\n z.object({\n modifier_name: z.string(),\n modifier_value: z.string(),\n }),\n )\n .describe('list of the modifiers applied on this item, such as size'),\n }),\n ),\n });\n const result = oaiParams(schema);\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('optional parameters', () => {\n it('should create a tool without parameters', async () => {\n const simpleAction = tool({\n description: 'Perform a simple action',\n execute: async () => {\n return 'Action performed';\n },\n });\n\n expect(simpleAction.type).toBe('function');\n expect(simpleAction.description).toBe('Perform a simple action');\n expect(simpleAction.parameters).toBeDefined();\n expect(simpleAction.parameters._def.typeName).toBe('ZodObject');\n\n const result = await simpleAction.execute({}, createToolOptions('123'));\n expect(result).toBe('Action performed');\n });\n\n it('should handle tools with context but no parameters', async () => {\n const greetUser = tool({\n description: 'Greet the current user',\n execute: async (_, { ctx }: ToolOptions<{ username: string }>) => {\n return `Hello, ${ctx.userData.username}!`;\n },\n });\n\n const result = await greetUser.execute({}, createToolOptions('123', { username: 'Alice' }));\n expect(result).toBe('Hello, Alice!');\n });\n\n it('should create a tool that accesses tool call id without parameters', async () => {\n const getCallId = tool({\n description: 'Get the current tool call ID',\n execute: async (_, { toolCallId }) => {\n return `Tool call ID: ${toolCallId}`;\n },\n });\n\n const result = await getCallId.execute({}, createToolOptions('test-id-456'));\n expect(result).toBe('Tool call ID: test-id-456');\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_zod = require("zod");
4
+ var import_index = require("./index.cjs");
5
+ (0, import_vitest.describe)("tool type inference", () => {
6
+ (0, import_vitest.it)("should infer argument type from zod schema", () => {
7
+ const toolType = (0, import_index.tool)({
8
+ description: "test",
9
+ parameters: import_zod.z.object({ number: import_zod.z.number() }),
10
+ execute: async () => "test"
11
+ });
12
+ (0, import_vitest.expectTypeOf)(toolType).toEqualTypeOf();
13
+ });
14
+ (0, import_vitest.it)("should infer provider defined tool type", () => {
15
+ const toolType = (0, import_index.tool)({
16
+ id: "code-interpreter",
17
+ config: {
18
+ language: "python"
19
+ }
20
+ });
21
+ (0, import_vitest.expectTypeOf)(toolType).toEqualTypeOf();
22
+ });
23
+ (0, import_vitest.it)("should infer run context type", () => {
24
+ const toolType = (0, import_index.tool)({
25
+ description: "test",
26
+ parameters: import_zod.z.object({ number: import_zod.z.number() }),
27
+ execute: async ({ number }, { ctx }) => {
28
+ return `The number is ${number}, ${ctx.userData.name}`;
29
+ }
30
+ });
31
+ (0, import_vitest.expectTypeOf)(toolType).toEqualTypeOf();
32
+ });
33
+ (0, import_vitest.it)("should not accept primitive zod schemas", () => {
34
+ (0, import_vitest.expect)(() => {
35
+ (0, import_index.tool)({
36
+ name: "test",
37
+ description: "test",
38
+ parameters: import_zod.z.string(),
39
+ execute: async () => "test"
40
+ });
41
+ }).toThrowError("Tool parameters must be a Zod object schema (z.object(...))");
42
+ });
43
+ (0, import_vitest.it)("should not accept array schemas", () => {
44
+ (0, import_vitest.expect)(() => {
45
+ (0, import_index.tool)({
46
+ name: "test",
47
+ description: "test",
48
+ parameters: import_zod.z.array(import_zod.z.string()),
49
+ execute: async () => "test"
50
+ });
51
+ }).toThrowError("Tool parameters must be a Zod object schema (z.object(...))");
52
+ });
53
+ (0, import_vitest.it)("should not accept union schemas", () => {
54
+ (0, import_vitest.expect)(() => {
55
+ (0, import_index.tool)({
56
+ name: "test",
57
+ description: "test",
58
+ parameters: import_zod.z.union([import_zod.z.object({ a: import_zod.z.string() }), import_zod.z.object({ b: import_zod.z.number() })]),
59
+ execute: async () => "test"
60
+ });
61
+ }).toThrowError("Tool parameters must be a Zod object schema (z.object(...))");
62
+ });
63
+ (0, import_vitest.it)("should not accept non-Zod values as parameters", () => {
64
+ (0, import_vitest.expect)(() => {
65
+ (0, import_index.tool)({
66
+ name: "test",
67
+ description: "test",
68
+ parameters: "invalid schema",
69
+ execute: async () => "test"
70
+ });
71
+ }).toThrowError("Tool parameters must be a Zod object schema or a raw JSON schema");
72
+ });
73
+ (0, import_vitest.it)("should infer empty object type when parameters are omitted", () => {
74
+ const toolType = (0, import_index.tool)({
75
+ description: "Simple action without parameters",
76
+ execute: async () => "done"
77
+ });
78
+ (0, import_vitest.expectTypeOf)(toolType).toEqualTypeOf();
79
+ });
80
+ (0, import_vitest.it)("should infer correct types with context but no parameters", () => {
81
+ const toolType = (0, import_index.tool)({
82
+ description: "Action with context",
83
+ execute: async (args, { ctx }) => {
84
+ (0, import_vitest.expectTypeOf)(args).toEqualTypeOf();
85
+ (0, import_vitest.expectTypeOf)(ctx.userData.userId).toEqualTypeOf();
86
+ return ctx.userData.userId;
87
+ }
88
+ });
89
+ (0, import_vitest.expectTypeOf)(toolType).toEqualTypeOf();
90
+ });
91
+ });
92
+ //# sourceMappingURL=tool_context.type.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/llm/tool_context.type.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, expectTypeOf, it } from 'vitest';\nimport { z } from 'zod';\nimport { type FunctionTool, type ProviderDefinedTool, type ToolOptions, tool } from './index.js';\n\ndescribe('tool type inference', () => {\n it('should infer argument type from zod schema', () => {\n const toolType = tool({\n description: 'test',\n parameters: z.object({ number: z.number() }),\n execute: async () => 'test' as const,\n });\n\n expectTypeOf(toolType).toEqualTypeOf<FunctionTool<{ number: number }, unknown, 'test'>>();\n });\n\n it('should infer provider defined tool type', () => {\n const toolType = tool({\n id: 'code-interpreter',\n config: {\n language: 'python',\n },\n });\n\n expectTypeOf(toolType).toEqualTypeOf<ProviderDefinedTool>();\n });\n\n it('should infer run context type', () => {\n const toolType = tool({\n description: 'test',\n parameters: z.object({ number: z.number() }),\n execute: async ({ number }, { ctx }: ToolOptions<{ name: string }>) => {\n return `The number is ${number}, ${ctx.userData.name}`;\n },\n });\n\n expectTypeOf(toolType).toEqualTypeOf<\n FunctionTool<{ number: number }, { name: string }, string>\n >();\n });\n\n it('should not accept primitive zod schemas', () => {\n expect(() => {\n // @ts-expect-error - Testing that non-object schemas are rejected\n tool({\n name: 'test',\n description: 'test',\n parameters: z.string(),\n execute: async () => 'test' as const,\n });\n }).toThrowError('Tool parameters must be a Zod object schema (z.object(...))');\n });\n\n it('should not accept array schemas', () => {\n expect(() => {\n // @ts-expect-error - Testing that array schemas are rejected\n tool({\n name: 'test',\n description: 'test',\n parameters: z.array(z.string()),\n execute: async () => 'test' as const,\n });\n }).toThrowError('Tool parameters must be a Zod object schema (z.object(...))');\n });\n\n it('should not accept union schemas', () => {\n expect(() => {\n // @ts-expect-error - Testing that union schemas are rejected\n tool({\n name: 'test',\n description: 'test',\n parameters: z.union([z.object({ a: z.string() }), z.object({ b: z.number() })]),\n execute: async () => 'test' as const,\n });\n }).toThrowError('Tool parameters must be a Zod object schema (z.object(...))');\n });\n\n it('should not accept non-Zod values as parameters', () => {\n expect(() => {\n // @ts-expect-error - Testing that non-Zod values are rejected\n tool({\n name: 'test',\n description: 'test',\n parameters: 'invalid schema',\n execute: async () => 'test' as const,\n });\n }).toThrowError('Tool parameters must be a Zod object schema or a raw JSON schema');\n });\n\n it('should infer empty object type when parameters are omitted', () => {\n const toolType = tool({\n description: 'Simple action without parameters',\n execute: async () => 'done' as const,\n });\n\n expectTypeOf(toolType).toEqualTypeOf<FunctionTool<Record<string, never>, unknown, 'done'>>();\n });\n\n it('should infer correct types with context but no parameters', () => {\n const toolType = tool({\n description: 'Action with context',\n execute: async (args, { ctx }: ToolOptions<{ userId: number }>) => {\n expectTypeOf(args).toEqualTypeOf<Record<string, never>>();\n expectTypeOf(ctx.userData.userId).toEqualTypeOf<number>();\n return ctx.userData.userId;\n },\n });\n\n expectTypeOf(toolType).toEqualTypeOf<\n FunctionTool<Record<string, never>, { userId: number }, number>\n >();\n });\n});\n"],"mappings":";AAGA,oBAAmD;AACnD,iBAAkB;AAClB,mBAAoF;AAAA,IAEpF,wBAAS,uBAAuB,MAAM;AACpC,wBAAG,8CAA8C,MAAM;AACrD,UAAM,eAAW,mBAAK;AAAA,MACpB,aAAa;AAAA,MACb,YAAY,aAAE,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,CAAC;AAAA,MAC3C,SAAS,YAAY;AAAA,IACvB,CAAC;AAED,oCAAa,QAAQ,EAAE,cAAiE;AAAA,EAC1F,CAAC;AAED,wBAAG,2CAA2C,MAAM;AAClD,UAAM,eAAW,mBAAK;AAAA,MACpB,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,oCAAa,QAAQ,EAAE,cAAmC;AAAA,EAC5D,CAAC;AAED,wBAAG,iCAAiC,MAAM;AACxC,UAAM,eAAW,mBAAK;AAAA,MACpB,aAAa;AAAA,MACb,YAAY,aAAE,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,CAAC;AAAA,MAC3C,SAAS,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,MAAqC;AACrE,eAAO,iBAAiB,MAAM,KAAK,IAAI,SAAS,IAAI;AAAA,MACtD;AAAA,IACF,CAAC;AAED,oCAAa,QAAQ,EAAE,cAErB;AAAA,EACJ,CAAC;AAED,wBAAG,2CAA2C,MAAM;AAClD,8BAAO,MAAM;AAEX,6BAAK;AAAA,QACH,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY,aAAE,OAAO;AAAA,QACrB,SAAS,YAAY;AAAA,MACvB,CAAC;AAAA,IACH,CAAC,EAAE,aAAa,6DAA6D;AAAA,EAC/E,CAAC;AAED,wBAAG,mCAAmC,MAAM;AAC1C,8BAAO,MAAM;AAEX,6BAAK;AAAA,QACH,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,QAC9B,SAAS,YAAY;AAAA,MACvB,CAAC;AAAA,IACH,CAAC,EAAE,aAAa,6DAA6D;AAAA,EAC/E,CAAC;AAED,wBAAG,mCAAmC,MAAM;AAC1C,8BAAO,MAAM;AAEX,6BAAK;AAAA,QACH,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY,aAAE,MAAM,CAAC,aAAE,OAAO,EAAE,GAAG,aAAE,OAAO,EAAE,CAAC,GAAG,aAAE,OAAO,EAAE,GAAG,aAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAAA,QAC9E,SAAS,YAAY;AAAA,MACvB,CAAC;AAAA,IACH,CAAC,EAAE,aAAa,6DAA6D;AAAA,EAC/E,CAAC;AAED,wBAAG,kDAAkD,MAAM;AACzD,8BAAO,MAAM;AAEX,6BAAK;AAAA,QACH,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,SAAS,YAAY;AAAA,MACvB,CAAC;AAAA,IACH,CAAC,EAAE,aAAa,kEAAkE;AAAA,EACpF,CAAC;AAED,wBAAG,8DAA8D,MAAM;AACrE,UAAM,eAAW,mBAAK;AAAA,MACpB,aAAa;AAAA,MACb,SAAS,YAAY;AAAA,IACvB,CAAC;AAED,oCAAa,QAAQ,EAAE,cAAoE;AAAA,EAC7F,CAAC;AAED,wBAAG,6DAA6D,MAAM;AACpE,UAAM,eAAW,mBAAK;AAAA,MACpB,aAAa;AAAA,MACb,SAAS,OAAO,MAAM,EAAE,IAAI,MAAuC;AACjE,wCAAa,IAAI,EAAE,cAAqC;AACxD,wCAAa,IAAI,SAAS,MAAM,EAAE,cAAsB;AACxD,eAAO,IAAI,SAAS;AAAA,MACtB;AAAA,IACF,CAAC;AAED,oCAAa,QAAQ,EAAE,cAErB;AAAA,EACJ,CAAC;AACH,CAAC;","names":[]}