@livekit/agents 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (959) hide show
  1. package/dist/_exceptions.cjs.map +1 -1
  2. package/dist/_exceptions.d.ts.map +1 -1
  3. package/dist/_exceptions.js.map +1 -1
  4. package/dist/audio.cjs +89 -3
  5. package/dist/audio.cjs.map +1 -1
  6. package/dist/audio.d.cts +36 -1
  7. package/dist/audio.d.ts +36 -1
  8. package/dist/audio.d.ts.map +1 -1
  9. package/dist/audio.js +76 -2
  10. package/dist/audio.js.map +1 -1
  11. package/dist/beta/index.cjs +29 -0
  12. package/dist/beta/index.cjs.map +1 -0
  13. package/dist/beta/index.d.cts +2 -0
  14. package/dist/beta/index.d.ts +2 -0
  15. package/dist/beta/index.d.ts.map +1 -0
  16. package/dist/beta/index.js +7 -0
  17. package/dist/beta/index.js.map +1 -0
  18. package/dist/beta/workflows/index.cjs +29 -0
  19. package/dist/beta/workflows/index.cjs.map +1 -0
  20. package/dist/beta/workflows/index.d.cts +2 -0
  21. package/dist/beta/workflows/index.d.ts +2 -0
  22. package/dist/beta/workflows/index.d.ts.map +1 -0
  23. package/dist/beta/workflows/index.js +7 -0
  24. package/dist/beta/workflows/index.js.map +1 -0
  25. package/dist/beta/workflows/task_group.cjs +165 -0
  26. package/dist/beta/workflows/task_group.cjs.map +1 -0
  27. package/dist/beta/workflows/task_group.d.cts +32 -0
  28. package/dist/beta/workflows/task_group.d.ts +32 -0
  29. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  30. package/dist/beta/workflows/task_group.js +141 -0
  31. package/dist/beta/workflows/task_group.js.map +1 -0
  32. package/dist/cli.cjs +44 -46
  33. package/dist/cli.cjs.map +1 -1
  34. package/dist/cli.d.cts +3 -3
  35. package/dist/cli.d.ts +3 -3
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +45 -47
  38. package/dist/cli.js.map +1 -1
  39. package/dist/connection_pool.cjs +242 -0
  40. package/dist/connection_pool.cjs.map +1 -0
  41. package/dist/connection_pool.d.cts +123 -0
  42. package/dist/connection_pool.d.ts +123 -0
  43. package/dist/connection_pool.d.ts.map +1 -0
  44. package/dist/connection_pool.js +218 -0
  45. package/dist/connection_pool.js.map +1 -0
  46. package/dist/connection_pool.test.cjs +256 -0
  47. package/dist/connection_pool.test.cjs.map +1 -0
  48. package/dist/connection_pool.test.js +255 -0
  49. package/dist/connection_pool.test.js.map +1 -0
  50. package/dist/constants.cjs +30 -0
  51. package/dist/constants.cjs.map +1 -1
  52. package/dist/constants.d.cts +10 -0
  53. package/dist/constants.d.ts +10 -0
  54. package/dist/constants.d.ts.map +1 -1
  55. package/dist/constants.js +20 -0
  56. package/dist/constants.js.map +1 -1
  57. package/dist/cpu.cjs +189 -0
  58. package/dist/cpu.cjs.map +1 -0
  59. package/dist/cpu.d.cts +24 -0
  60. package/dist/cpu.d.ts +24 -0
  61. package/dist/cpu.d.ts.map +1 -0
  62. package/dist/cpu.js +152 -0
  63. package/dist/cpu.js.map +1 -0
  64. package/dist/cpu.test.cjs +227 -0
  65. package/dist/cpu.test.cjs.map +1 -0
  66. package/dist/cpu.test.js +204 -0
  67. package/dist/cpu.test.js.map +1 -0
  68. package/dist/http_server.cjs +9 -6
  69. package/dist/http_server.cjs.map +1 -1
  70. package/dist/http_server.d.cts +5 -1
  71. package/dist/http_server.d.ts +5 -1
  72. package/dist/http_server.d.ts.map +1 -1
  73. package/dist/http_server.js +9 -6
  74. package/dist/http_server.js.map +1 -1
  75. package/dist/index.cjs +24 -9
  76. package/dist/index.cjs.map +1 -1
  77. package/dist/index.d.cts +15 -11
  78. package/dist/index.d.ts +15 -11
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +18 -9
  81. package/dist/index.js.map +1 -1
  82. package/dist/inference/api_protos.cjs +70 -2
  83. package/dist/inference/api_protos.cjs.map +1 -1
  84. package/dist/inference/api_protos.d.cts +373 -32
  85. package/dist/inference/api_protos.d.ts +373 -32
  86. package/dist/inference/api_protos.d.ts.map +1 -1
  87. package/dist/inference/api_protos.js +62 -2
  88. package/dist/inference/api_protos.js.map +1 -1
  89. package/dist/inference/index.cjs +8 -0
  90. package/dist/inference/index.cjs.map +1 -1
  91. package/dist/inference/index.d.cts +3 -4
  92. package/dist/inference/index.d.ts +3 -4
  93. package/dist/inference/index.d.ts.map +1 -1
  94. package/dist/inference/index.js +18 -3
  95. package/dist/inference/index.js.map +1 -1
  96. package/dist/inference/interruption/defaults.cjs +81 -0
  97. package/dist/inference/interruption/defaults.cjs.map +1 -0
  98. package/dist/inference/interruption/defaults.d.cts +19 -0
  99. package/dist/inference/interruption/defaults.d.ts +19 -0
  100. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  101. package/dist/inference/interruption/defaults.js +46 -0
  102. package/dist/inference/interruption/defaults.js.map +1 -0
  103. package/dist/inference/interruption/errors.cjs +44 -0
  104. package/dist/inference/interruption/errors.cjs.map +1 -0
  105. package/dist/inference/interruption/errors.d.cts +12 -0
  106. package/dist/inference/interruption/errors.d.ts +12 -0
  107. package/dist/inference/interruption/errors.d.ts.map +1 -0
  108. package/dist/inference/interruption/errors.js +20 -0
  109. package/dist/inference/interruption/errors.js.map +1 -0
  110. package/dist/inference/interruption/http_transport.cjs +163 -0
  111. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  112. package/dist/inference/interruption/http_transport.d.cts +65 -0
  113. package/dist/inference/interruption/http_transport.d.ts +65 -0
  114. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  115. package/dist/inference/interruption/http_transport.js +137 -0
  116. package/dist/inference/interruption/http_transport.js.map +1 -0
  117. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  118. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  119. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  120. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  121. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  122. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  123. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  124. package/dist/inference/interruption/interruption_detector.cjs +198 -0
  125. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  126. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  127. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  128. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  129. package/dist/inference/interruption/interruption_detector.js +164 -0
  130. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  131. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  132. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  133. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  134. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  135. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  136. package/dist/inference/interruption/interruption_stream.js +344 -0
  137. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  138. package/dist/inference/interruption/types.cjs +17 -0
  139. package/dist/inference/interruption/types.cjs.map +1 -0
  140. package/dist/inference/interruption/types.d.cts +66 -0
  141. package/dist/inference/interruption/types.d.ts +66 -0
  142. package/dist/inference/interruption/types.d.ts.map +1 -0
  143. package/dist/inference/interruption/types.js +1 -0
  144. package/dist/inference/interruption/types.js.map +1 -0
  145. package/dist/inference/interruption/utils.cjs +130 -0
  146. package/dist/inference/interruption/utils.cjs.map +1 -0
  147. package/dist/inference/interruption/utils.d.cts +41 -0
  148. package/dist/inference/interruption/utils.d.ts +41 -0
  149. package/dist/inference/interruption/utils.d.ts.map +1 -0
  150. package/dist/inference/interruption/utils.js +105 -0
  151. package/dist/inference/interruption/utils.js.map +1 -0
  152. package/dist/inference/interruption/utils.test.cjs +105 -0
  153. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  154. package/dist/inference/interruption/utils.test.js +104 -0
  155. package/dist/inference/interruption/utils.test.js.map +1 -0
  156. package/dist/inference/interruption/ws_transport.cjs +347 -0
  157. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  158. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  159. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  160. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  161. package/dist/inference/interruption/ws_transport.js +313 -0
  162. package/dist/inference/interruption/ws_transport.js.map +1 -0
  163. package/dist/inference/llm.cjs +106 -66
  164. package/dist/inference/llm.cjs.map +1 -1
  165. package/dist/inference/llm.d.cts +65 -43
  166. package/dist/inference/llm.d.ts +65 -43
  167. package/dist/inference/llm.d.ts.map +1 -1
  168. package/dist/inference/llm.js +100 -66
  169. package/dist/inference/llm.js.map +1 -1
  170. package/dist/inference/stt.cjs +319 -170
  171. package/dist/inference/stt.cjs.map +1 -1
  172. package/dist/inference/stt.d.cts +64 -15
  173. package/dist/inference/stt.d.ts +64 -15
  174. package/dist/inference/stt.d.ts.map +1 -1
  175. package/dist/inference/stt.js +319 -170
  176. package/dist/inference/stt.js.map +1 -1
  177. package/dist/inference/stt.test.cjs +218 -0
  178. package/dist/inference/stt.test.cjs.map +1 -0
  179. package/dist/inference/stt.test.js +217 -0
  180. package/dist/inference/stt.test.js.map +1 -0
  181. package/dist/inference/tts.cjs +249 -71
  182. package/dist/inference/tts.cjs.map +1 -1
  183. package/dist/inference/tts.d.cts +94 -17
  184. package/dist/inference/tts.d.ts +94 -17
  185. package/dist/inference/tts.d.ts.map +1 -1
  186. package/dist/inference/tts.js +249 -77
  187. package/dist/inference/tts.js.map +1 -1
  188. package/dist/inference/tts.test.cjs +305 -0
  189. package/dist/inference/tts.test.cjs.map +1 -0
  190. package/dist/inference/tts.test.js +304 -0
  191. package/dist/inference/tts.test.js.map +1 -0
  192. package/dist/inference/utils.cjs +26 -7
  193. package/dist/inference/utils.cjs.map +1 -1
  194. package/dist/inference/utils.d.cts +14 -1
  195. package/dist/inference/utils.d.ts +14 -1
  196. package/dist/inference/utils.d.ts.map +1 -1
  197. package/dist/inference/utils.js +18 -2
  198. package/dist/inference/utils.js.map +1 -1
  199. package/dist/ipc/inference_proc_executor.cjs +6 -3
  200. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  201. package/dist/ipc/inference_proc_executor.d.ts.map +1 -1
  202. package/dist/ipc/inference_proc_executor.js +6 -3
  203. package/dist/ipc/inference_proc_executor.js.map +1 -1
  204. package/dist/ipc/inference_proc_lazy_main.cjs +13 -1
  205. package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -1
  206. package/dist/ipc/inference_proc_lazy_main.js +13 -1
  207. package/dist/ipc/inference_proc_lazy_main.js.map +1 -1
  208. package/dist/ipc/job_proc_executor.cjs +6 -1
  209. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  210. package/dist/ipc/job_proc_executor.d.ts.map +1 -1
  211. package/dist/ipc/job_proc_executor.js +6 -1
  212. package/dist/ipc/job_proc_executor.js.map +1 -1
  213. package/dist/ipc/job_proc_lazy_main.cjs +89 -17
  214. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  215. package/dist/ipc/job_proc_lazy_main.js +68 -18
  216. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  217. package/dist/ipc/supervised_proc.cjs +34 -8
  218. package/dist/ipc/supervised_proc.cjs.map +1 -1
  219. package/dist/ipc/supervised_proc.d.cts +8 -0
  220. package/dist/ipc/supervised_proc.d.ts +8 -0
  221. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  222. package/dist/ipc/supervised_proc.js +34 -8
  223. package/dist/ipc/supervised_proc.js.map +1 -1
  224. package/dist/ipc/supervised_proc.test.cjs +145 -0
  225. package/dist/ipc/supervised_proc.test.cjs.map +1 -0
  226. package/dist/ipc/supervised_proc.test.js +122 -0
  227. package/dist/ipc/supervised_proc.test.js.map +1 -0
  228. package/dist/job.cjs +109 -1
  229. package/dist/job.cjs.map +1 -1
  230. package/dist/job.d.cts +14 -0
  231. package/dist/job.d.ts +14 -0
  232. package/dist/job.d.ts.map +1 -1
  233. package/dist/job.js +99 -1
  234. package/dist/job.js.map +1 -1
  235. package/dist/language.cjs +394 -0
  236. package/dist/language.cjs.map +1 -0
  237. package/dist/language.d.cts +15 -0
  238. package/dist/language.d.ts +15 -0
  239. package/dist/language.d.ts.map +1 -0
  240. package/dist/language.js +363 -0
  241. package/dist/language.js.map +1 -0
  242. package/dist/language.test.cjs +43 -0
  243. package/dist/language.test.cjs.map +1 -0
  244. package/dist/language.test.js +49 -0
  245. package/dist/language.test.js.map +1 -0
  246. package/dist/llm/chat_context.cjs +345 -3
  247. package/dist/llm/chat_context.cjs.map +1 -1
  248. package/dist/llm/chat_context.d.cts +86 -2
  249. package/dist/llm/chat_context.d.ts +86 -2
  250. package/dist/llm/chat_context.d.ts.map +1 -1
  251. package/dist/llm/chat_context.js +344 -3
  252. package/dist/llm/chat_context.js.map +1 -1
  253. package/dist/llm/chat_context.test.cjs +692 -0
  254. package/dist/llm/chat_context.test.cjs.map +1 -1
  255. package/dist/llm/chat_context.test.js +692 -0
  256. package/dist/llm/chat_context.test.js.map +1 -1
  257. package/dist/llm/fallback_adapter.cjs +280 -0
  258. package/dist/llm/fallback_adapter.cjs.map +1 -0
  259. package/dist/llm/fallback_adapter.d.cts +73 -0
  260. package/dist/llm/fallback_adapter.d.ts +73 -0
  261. package/dist/llm/fallback_adapter.d.ts.map +1 -0
  262. package/dist/llm/fallback_adapter.js +256 -0
  263. package/dist/llm/fallback_adapter.js.map +1 -0
  264. package/dist/llm/fallback_adapter.test.cjs +176 -0
  265. package/dist/llm/fallback_adapter.test.cjs.map +1 -0
  266. package/dist/llm/fallback_adapter.test.js +175 -0
  267. package/dist/llm/fallback_adapter.test.js.map +1 -0
  268. package/dist/llm/index.cjs +11 -0
  269. package/dist/llm/index.cjs.map +1 -1
  270. package/dist/llm/index.d.cts +4 -3
  271. package/dist/llm/index.d.ts +4 -3
  272. package/dist/llm/index.d.ts.map +1 -1
  273. package/dist/llm/index.js +13 -1
  274. package/dist/llm/index.js.map +1 -1
  275. package/dist/llm/llm.cjs +65 -11
  276. package/dist/llm/llm.cjs.map +1 -1
  277. package/dist/llm/llm.d.cts +13 -2
  278. package/dist/llm/llm.d.ts +13 -2
  279. package/dist/llm/llm.d.ts.map +1 -1
  280. package/dist/llm/llm.js +65 -11
  281. package/dist/llm/llm.js.map +1 -1
  282. package/dist/llm/provider_format/google.cjs +6 -2
  283. package/dist/llm/provider_format/google.cjs.map +1 -1
  284. package/dist/llm/provider_format/google.d.cts +1 -1
  285. package/dist/llm/provider_format/google.d.ts +1 -1
  286. package/dist/llm/provider_format/google.d.ts.map +1 -1
  287. package/dist/llm/provider_format/google.js +6 -2
  288. package/dist/llm/provider_format/google.js.map +1 -1
  289. package/dist/llm/provider_format/google.test.cjs +48 -0
  290. package/dist/llm/provider_format/google.test.cjs.map +1 -1
  291. package/dist/llm/provider_format/google.test.js +54 -1
  292. package/dist/llm/provider_format/google.test.js.map +1 -1
  293. package/dist/llm/provider_format/index.cjs +2 -0
  294. package/dist/llm/provider_format/index.cjs.map +1 -1
  295. package/dist/llm/provider_format/index.d.cts +2 -2
  296. package/dist/llm/provider_format/index.d.ts +2 -2
  297. package/dist/llm/provider_format/index.d.ts.map +1 -1
  298. package/dist/llm/provider_format/index.js +6 -1
  299. package/dist/llm/provider_format/index.js.map +1 -1
  300. package/dist/llm/provider_format/openai.cjs +126 -24
  301. package/dist/llm/provider_format/openai.cjs.map +1 -1
  302. package/dist/llm/provider_format/openai.d.cts +1 -0
  303. package/dist/llm/provider_format/openai.d.ts +1 -0
  304. package/dist/llm/provider_format/openai.d.ts.map +1 -1
  305. package/dist/llm/provider_format/openai.js +124 -23
  306. package/dist/llm/provider_format/openai.js.map +1 -1
  307. package/dist/llm/provider_format/openai.test.cjs +393 -0
  308. package/dist/llm/provider_format/openai.test.cjs.map +1 -1
  309. package/dist/llm/provider_format/openai.test.js +400 -2
  310. package/dist/llm/provider_format/openai.test.js.map +1 -1
  311. package/dist/llm/provider_format/utils.cjs +5 -4
  312. package/dist/llm/provider_format/utils.cjs.map +1 -1
  313. package/dist/llm/provider_format/utils.d.ts.map +1 -1
  314. package/dist/llm/provider_format/utils.js +5 -4
  315. package/dist/llm/provider_format/utils.js.map +1 -1
  316. package/dist/llm/realtime.cjs +3 -0
  317. package/dist/llm/realtime.cjs.map +1 -1
  318. package/dist/llm/realtime.d.cts +15 -1
  319. package/dist/llm/realtime.d.ts +15 -1
  320. package/dist/llm/realtime.d.ts.map +1 -1
  321. package/dist/llm/realtime.js +3 -0
  322. package/dist/llm/realtime.js.map +1 -1
  323. package/dist/llm/remote_chat_context.cjs.map +1 -1
  324. package/dist/llm/remote_chat_context.d.cts +2 -0
  325. package/dist/llm/remote_chat_context.d.ts +2 -0
  326. package/dist/llm/remote_chat_context.d.ts.map +1 -1
  327. package/dist/llm/remote_chat_context.js.map +1 -1
  328. package/dist/llm/tool_context.cjs +50 -2
  329. package/dist/llm/tool_context.cjs.map +1 -1
  330. package/dist/llm/tool_context.d.cts +47 -11
  331. package/dist/llm/tool_context.d.ts +47 -11
  332. package/dist/llm/tool_context.d.ts.map +1 -1
  333. package/dist/llm/tool_context.js +48 -3
  334. package/dist/llm/tool_context.js.map +1 -1
  335. package/dist/llm/tool_context.test.cjs +197 -0
  336. package/dist/llm/tool_context.test.cjs.map +1 -1
  337. package/dist/llm/tool_context.test.js +175 -0
  338. package/dist/llm/tool_context.test.js.map +1 -1
  339. package/dist/llm/utils.cjs +107 -12
  340. package/dist/llm/utils.cjs.map +1 -1
  341. package/dist/llm/utils.d.cts +10 -3
  342. package/dist/llm/utils.d.ts +10 -3
  343. package/dist/llm/utils.d.ts.map +1 -1
  344. package/dist/llm/utils.js +106 -12
  345. package/dist/llm/utils.js.map +1 -1
  346. package/dist/llm/utils.test.cjs +90 -0
  347. package/dist/llm/utils.test.cjs.map +1 -1
  348. package/dist/llm/utils.test.js +98 -2
  349. package/dist/llm/utils.test.js.map +1 -1
  350. package/dist/llm/zod-utils.cjs +102 -0
  351. package/dist/llm/zod-utils.cjs.map +1 -0
  352. package/dist/llm/zod-utils.d.cts +65 -0
  353. package/dist/llm/zod-utils.d.ts +65 -0
  354. package/dist/llm/zod-utils.d.ts.map +1 -0
  355. package/dist/llm/zod-utils.js +64 -0
  356. package/dist/llm/zod-utils.js.map +1 -0
  357. package/dist/llm/zod-utils.test.cjs +472 -0
  358. package/dist/llm/zod-utils.test.cjs.map +1 -0
  359. package/dist/llm/zod-utils.test.js +455 -0
  360. package/dist/llm/zod-utils.test.js.map +1 -0
  361. package/dist/log.cjs +45 -14
  362. package/dist/log.cjs.map +1 -1
  363. package/dist/log.d.cts +8 -1
  364. package/dist/log.d.ts +8 -1
  365. package/dist/log.d.ts.map +1 -1
  366. package/dist/log.js +45 -15
  367. package/dist/log.js.map +1 -1
  368. package/dist/metrics/base.cjs.map +1 -1
  369. package/dist/metrics/base.d.cts +75 -19
  370. package/dist/metrics/base.d.ts +75 -19
  371. package/dist/metrics/base.d.ts.map +1 -1
  372. package/dist/metrics/index.cjs +5 -0
  373. package/dist/metrics/index.cjs.map +1 -1
  374. package/dist/metrics/index.d.cts +2 -1
  375. package/dist/metrics/index.d.ts +2 -1
  376. package/dist/metrics/index.d.ts.map +1 -1
  377. package/dist/metrics/index.js +6 -0
  378. package/dist/metrics/index.js.map +1 -1
  379. package/dist/metrics/model_usage.cjs +189 -0
  380. package/dist/metrics/model_usage.cjs.map +1 -0
  381. package/dist/metrics/model_usage.d.cts +92 -0
  382. package/dist/metrics/model_usage.d.ts +92 -0
  383. package/dist/metrics/model_usage.d.ts.map +1 -0
  384. package/dist/metrics/model_usage.js +164 -0
  385. package/dist/metrics/model_usage.js.map +1 -0
  386. package/dist/metrics/model_usage.test.cjs +474 -0
  387. package/dist/metrics/model_usage.test.cjs.map +1 -0
  388. package/dist/metrics/model_usage.test.js +476 -0
  389. package/dist/metrics/model_usage.test.js.map +1 -0
  390. package/dist/metrics/usage_collector.cjs +5 -2
  391. package/dist/metrics/usage_collector.cjs.map +1 -1
  392. package/dist/metrics/usage_collector.d.cts +10 -1
  393. package/dist/metrics/usage_collector.d.ts +10 -1
  394. package/dist/metrics/usage_collector.d.ts.map +1 -1
  395. package/dist/metrics/usage_collector.js +5 -2
  396. package/dist/metrics/usage_collector.js.map +1 -1
  397. package/dist/metrics/utils.cjs +23 -7
  398. package/dist/metrics/utils.cjs.map +1 -1
  399. package/dist/metrics/utils.d.ts.map +1 -1
  400. package/dist/metrics/utils.js +23 -7
  401. package/dist/metrics/utils.js.map +1 -1
  402. package/dist/stream/deferred_stream.cjs +31 -10
  403. package/dist/stream/deferred_stream.cjs.map +1 -1
  404. package/dist/stream/deferred_stream.d.cts +6 -1
  405. package/dist/stream/deferred_stream.d.ts +6 -1
  406. package/dist/stream/deferred_stream.d.ts.map +1 -1
  407. package/dist/stream/deferred_stream.js +31 -10
  408. package/dist/stream/deferred_stream.js.map +1 -1
  409. package/dist/stream/deferred_stream.test.cjs +2 -2
  410. package/dist/stream/deferred_stream.test.cjs.map +1 -1
  411. package/dist/stream/deferred_stream.test.js +2 -2
  412. package/dist/stream/deferred_stream.test.js.map +1 -1
  413. package/dist/stream/index.cjs +3 -0
  414. package/dist/stream/index.cjs.map +1 -1
  415. package/dist/stream/index.d.cts +1 -0
  416. package/dist/stream/index.d.ts +1 -0
  417. package/dist/stream/index.d.ts.map +1 -1
  418. package/dist/stream/index.js +2 -0
  419. package/dist/stream/index.js.map +1 -1
  420. package/dist/stream/multi_input_stream.cjs +139 -0
  421. package/dist/stream/multi_input_stream.cjs.map +1 -0
  422. package/dist/stream/multi_input_stream.d.cts +55 -0
  423. package/dist/stream/multi_input_stream.d.ts +55 -0
  424. package/dist/stream/multi_input_stream.d.ts.map +1 -0
  425. package/dist/stream/multi_input_stream.js +115 -0
  426. package/dist/stream/multi_input_stream.js.map +1 -0
  427. package/dist/stream/multi_input_stream.test.cjs +344 -0
  428. package/dist/stream/multi_input_stream.test.cjs.map +1 -0
  429. package/dist/stream/multi_input_stream.test.js +343 -0
  430. package/dist/stream/multi_input_stream.test.js.map +1 -0
  431. package/dist/stream/stream_channel.cjs +39 -1
  432. package/dist/stream/stream_channel.cjs.map +1 -1
  433. package/dist/stream/stream_channel.d.cts +5 -2
  434. package/dist/stream/stream_channel.d.ts +5 -2
  435. package/dist/stream/stream_channel.d.ts.map +1 -1
  436. package/dist/stream/stream_channel.js +39 -1
  437. package/dist/stream/stream_channel.js.map +1 -1
  438. package/dist/stream/stream_channel.test.cjs +27 -0
  439. package/dist/stream/stream_channel.test.cjs.map +1 -1
  440. package/dist/stream/stream_channel.test.js +27 -0
  441. package/dist/stream/stream_channel.test.js.map +1 -1
  442. package/dist/stt/stream_adapter.cjs +24 -9
  443. package/dist/stt/stream_adapter.cjs.map +1 -1
  444. package/dist/stt/stream_adapter.d.cts +7 -3
  445. package/dist/stt/stream_adapter.d.ts +7 -3
  446. package/dist/stt/stream_adapter.d.ts.map +1 -1
  447. package/dist/stt/stream_adapter.js +24 -9
  448. package/dist/stt/stream_adapter.js.map +1 -1
  449. package/dist/stt/stt.cjs +94 -19
  450. package/dist/stt/stt.cjs.map +1 -1
  451. package/dist/stt/stt.d.cts +68 -5
  452. package/dist/stt/stt.d.ts +68 -5
  453. package/dist/stt/stt.d.ts.map +1 -1
  454. package/dist/stt/stt.js +96 -21
  455. package/dist/stt/stt.js.map +1 -1
  456. package/dist/telemetry/index.cjs +72 -0
  457. package/dist/telemetry/index.cjs.map +1 -0
  458. package/dist/telemetry/index.d.cts +7 -0
  459. package/dist/telemetry/index.d.ts +7 -0
  460. package/dist/telemetry/index.d.ts.map +1 -0
  461. package/dist/telemetry/index.js +37 -0
  462. package/dist/telemetry/index.js.map +1 -0
  463. package/dist/telemetry/logging.cjs +65 -0
  464. package/dist/telemetry/logging.cjs.map +1 -0
  465. package/dist/telemetry/logging.d.cts +21 -0
  466. package/dist/telemetry/logging.d.ts +21 -0
  467. package/dist/telemetry/logging.d.ts.map +1 -0
  468. package/dist/telemetry/logging.js +40 -0
  469. package/dist/telemetry/logging.js.map +1 -0
  470. package/dist/telemetry/otel_http_exporter.cjs +166 -0
  471. package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
  472. package/dist/telemetry/otel_http_exporter.d.cts +63 -0
  473. package/dist/telemetry/otel_http_exporter.d.ts +63 -0
  474. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
  475. package/dist/telemetry/otel_http_exporter.js +142 -0
  476. package/dist/telemetry/otel_http_exporter.js.map +1 -0
  477. package/dist/telemetry/pino_otel_transport.cjs +217 -0
  478. package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
  479. package/dist/telemetry/pino_otel_transport.d.cts +58 -0
  480. package/dist/telemetry/pino_otel_transport.d.ts +58 -0
  481. package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
  482. package/dist/telemetry/pino_otel_transport.js +189 -0
  483. package/dist/telemetry/pino_otel_transport.js.map +1 -0
  484. package/dist/telemetry/trace_types.cjs +233 -0
  485. package/dist/telemetry/trace_types.cjs.map +1 -0
  486. package/dist/telemetry/trace_types.d.cts +74 -0
  487. package/dist/telemetry/trace_types.d.ts +74 -0
  488. package/dist/telemetry/trace_types.d.ts.map +1 -0
  489. package/dist/telemetry/trace_types.js +141 -0
  490. package/dist/telemetry/trace_types.js.map +1 -0
  491. package/dist/telemetry/traces.cjs +484 -0
  492. package/dist/telemetry/traces.cjs.map +1 -0
  493. package/dist/telemetry/traces.d.cts +116 -0
  494. package/dist/telemetry/traces.d.ts +116 -0
  495. package/dist/telemetry/traces.d.ts.map +1 -0
  496. package/dist/telemetry/traces.js +449 -0
  497. package/dist/telemetry/traces.js.map +1 -0
  498. package/dist/telemetry/utils.cjs +86 -0
  499. package/dist/telemetry/utils.cjs.map +1 -0
  500. package/dist/telemetry/utils.d.cts +5 -0
  501. package/dist/telemetry/utils.d.ts +5 -0
  502. package/dist/telemetry/utils.d.ts.map +1 -0
  503. package/dist/telemetry/utils.js +51 -0
  504. package/dist/telemetry/utils.js.map +1 -0
  505. package/dist/tokenize/basic/sentence.cjs +3 -3
  506. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  507. package/dist/tokenize/basic/sentence.js +3 -3
  508. package/dist/tokenize/basic/sentence.js.map +1 -1
  509. package/dist/tokenize/tokenizer.test.cjs +3 -1
  510. package/dist/tokenize/tokenizer.test.cjs.map +1 -1
  511. package/dist/tokenize/tokenizer.test.js +3 -1
  512. package/dist/tokenize/tokenizer.test.js.map +1 -1
  513. package/dist/transcription.cjs.map +1 -1
  514. package/dist/transcription.d.cts +6 -0
  515. package/dist/transcription.d.ts +6 -0
  516. package/dist/transcription.d.ts.map +1 -1
  517. package/dist/transcription.js.map +1 -1
  518. package/dist/tts/fallback_adapter.cjs +472 -0
  519. package/dist/tts/fallback_adapter.cjs.map +1 -0
  520. package/dist/tts/fallback_adapter.d.cts +110 -0
  521. package/dist/tts/fallback_adapter.d.ts +110 -0
  522. package/dist/tts/fallback_adapter.d.ts.map +1 -0
  523. package/dist/tts/fallback_adapter.js +448 -0
  524. package/dist/tts/fallback_adapter.js.map +1 -0
  525. package/dist/tts/index.cjs +3 -0
  526. package/dist/tts/index.cjs.map +1 -1
  527. package/dist/tts/index.d.cts +1 -0
  528. package/dist/tts/index.d.ts +1 -0
  529. package/dist/tts/index.d.ts.map +1 -1
  530. package/dist/tts/index.js +2 -0
  531. package/dist/tts/index.js.map +1 -1
  532. package/dist/tts/stream_adapter.cjs +25 -8
  533. package/dist/tts/stream_adapter.cjs.map +1 -1
  534. package/dist/tts/stream_adapter.d.cts +6 -3
  535. package/dist/tts/stream_adapter.d.ts +6 -3
  536. package/dist/tts/stream_adapter.d.ts.map +1 -1
  537. package/dist/tts/stream_adapter.js +25 -8
  538. package/dist/tts/stream_adapter.js.map +1 -1
  539. package/dist/tts/tts.cjs +189 -57
  540. package/dist/tts/tts.cjs.map +1 -1
  541. package/dist/tts/tts.d.cts +58 -6
  542. package/dist/tts/tts.d.ts +58 -6
  543. package/dist/tts/tts.d.ts.map +1 -1
  544. package/dist/tts/tts.js +191 -59
  545. package/dist/tts/tts.js.map +1 -1
  546. package/dist/typed_promise.cjs +48 -0
  547. package/dist/typed_promise.cjs.map +1 -0
  548. package/dist/typed_promise.d.cts +24 -0
  549. package/dist/typed_promise.d.ts +24 -0
  550. package/dist/typed_promise.d.ts.map +1 -0
  551. package/dist/typed_promise.js +28 -0
  552. package/dist/typed_promise.js.map +1 -0
  553. package/dist/types.cjs +24 -32
  554. package/dist/types.cjs.map +1 -1
  555. package/dist/types.d.cts +45 -10
  556. package/dist/types.d.ts +45 -10
  557. package/dist/types.d.ts.map +1 -1
  558. package/dist/types.js +20 -30
  559. package/dist/types.js.map +1 -1
  560. package/dist/utils.cjs +124 -28
  561. package/dist/utils.cjs.map +1 -1
  562. package/dist/utils.d.cts +41 -1
  563. package/dist/utils.d.ts +41 -1
  564. package/dist/utils.d.ts.map +1 -1
  565. package/dist/utils.js +119 -27
  566. package/dist/utils.js.map +1 -1
  567. package/dist/utils.test.cjs +73 -1
  568. package/dist/utils.test.cjs.map +1 -1
  569. package/dist/utils.test.js +74 -10
  570. package/dist/utils.test.js.map +1 -1
  571. package/dist/vad.cjs +35 -15
  572. package/dist/vad.cjs.map +1 -1
  573. package/dist/vad.d.cts +15 -5
  574. package/dist/vad.d.ts +15 -5
  575. package/dist/vad.d.ts.map +1 -1
  576. package/dist/vad.js +35 -15
  577. package/dist/vad.js.map +1 -1
  578. package/dist/version.cjs +1 -1
  579. package/dist/version.cjs.map +1 -1
  580. package/dist/version.d.cts +1 -1
  581. package/dist/version.d.ts +1 -1
  582. package/dist/version.d.ts.map +1 -1
  583. package/dist/version.js +1 -1
  584. package/dist/version.js.map +1 -1
  585. package/dist/voice/agent.cjs +258 -35
  586. package/dist/voice/agent.cjs.map +1 -1
  587. package/dist/voice/agent.d.cts +54 -13
  588. package/dist/voice/agent.d.ts +54 -13
  589. package/dist/voice/agent.d.ts.map +1 -1
  590. package/dist/voice/agent.js +254 -34
  591. package/dist/voice/agent.js.map +1 -1
  592. package/dist/voice/agent.test.cjs +314 -0
  593. package/dist/voice/agent.test.cjs.map +1 -1
  594. package/dist/voice/agent.test.js +316 -2
  595. package/dist/voice/agent.test.js.map +1 -1
  596. package/dist/voice/agent_activity.cjs +1116 -385
  597. package/dist/voice/agent_activity.cjs.map +1 -1
  598. package/dist/voice/agent_activity.d.cts +72 -11
  599. package/dist/voice/agent_activity.d.ts +72 -11
  600. package/dist/voice/agent_activity.d.ts.map +1 -1
  601. package/dist/voice/agent_activity.js +1119 -383
  602. package/dist/voice/agent_activity.js.map +1 -1
  603. package/dist/voice/agent_activity.test.cjs +135 -0
  604. package/dist/voice/agent_activity.test.cjs.map +1 -0
  605. package/dist/voice/agent_activity.test.js +134 -0
  606. package/dist/voice/agent_activity.test.js.map +1 -0
  607. package/dist/voice/agent_session.cjs +550 -90
  608. package/dist/voice/agent_session.cjs.map +1 -1
  609. package/dist/voice/agent_session.d.cts +185 -25
  610. package/dist/voice/agent_session.d.ts +185 -25
  611. package/dist/voice/agent_session.d.ts.map +1 -1
  612. package/dist/voice/agent_session.js +556 -91
  613. package/dist/voice/agent_session.js.map +1 -1
  614. package/dist/voice/audio_recognition.cjs +605 -46
  615. package/dist/voice/audio_recognition.cjs.map +1 -1
  616. package/dist/voice/audio_recognition.d.cts +96 -4
  617. package/dist/voice/audio_recognition.d.ts +96 -4
  618. package/dist/voice/audio_recognition.d.ts.map +1 -1
  619. package/dist/voice/audio_recognition.js +611 -47
  620. package/dist/voice/audio_recognition.js.map +1 -1
  621. package/dist/voice/audio_recognition_span.test.cjs +295 -0
  622. package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
  623. package/dist/voice/audio_recognition_span.test.js +299 -0
  624. package/dist/voice/audio_recognition_span.test.js.map +1 -0
  625. package/dist/voice/avatar/datastream_io.cjs +7 -1
  626. package/dist/voice/avatar/datastream_io.cjs.map +1 -1
  627. package/dist/voice/avatar/datastream_io.d.cts +1 -0
  628. package/dist/voice/avatar/datastream_io.d.ts +1 -0
  629. package/dist/voice/avatar/datastream_io.d.ts.map +1 -1
  630. package/dist/voice/avatar/datastream_io.js +7 -1
  631. package/dist/voice/avatar/datastream_io.js.map +1 -1
  632. package/dist/voice/background_audio.cjs +367 -0
  633. package/dist/voice/background_audio.cjs.map +1 -0
  634. package/dist/voice/background_audio.d.cts +123 -0
  635. package/dist/voice/background_audio.d.ts +123 -0
  636. package/dist/voice/background_audio.d.ts.map +1 -0
  637. package/dist/voice/background_audio.js +343 -0
  638. package/dist/voice/background_audio.js.map +1 -0
  639. package/dist/voice/events.cjs +3 -0
  640. package/dist/voice/events.cjs.map +1 -1
  641. package/dist/voice/events.d.cts +16 -9
  642. package/dist/voice/events.d.ts +16 -9
  643. package/dist/voice/events.d.ts.map +1 -1
  644. package/dist/voice/events.js +3 -0
  645. package/dist/voice/events.js.map +1 -1
  646. package/dist/voice/generation.cjs +205 -41
  647. package/dist/voice/generation.cjs.map +1 -1
  648. package/dist/voice/generation.d.cts +21 -5
  649. package/dist/voice/generation.d.ts +21 -5
  650. package/dist/voice/generation.d.ts.map +1 -1
  651. package/dist/voice/generation.js +215 -43
  652. package/dist/voice/generation.js.map +1 -1
  653. package/dist/voice/generation_tools.test.cjs +236 -0
  654. package/dist/voice/generation_tools.test.cjs.map +1 -0
  655. package/dist/voice/generation_tools.test.js +235 -0
  656. package/dist/voice/generation_tools.test.js.map +1 -0
  657. package/dist/voice/index.cjs +33 -2
  658. package/dist/voice/index.cjs.map +1 -1
  659. package/dist/voice/index.d.cts +8 -2
  660. package/dist/voice/index.d.ts +8 -2
  661. package/dist/voice/index.d.ts.map +1 -1
  662. package/dist/voice/index.js +19 -2
  663. package/dist/voice/index.js.map +1 -1
  664. package/dist/voice/interruption_detection.test.cjs +114 -0
  665. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  666. package/dist/voice/interruption_detection.test.js +113 -0
  667. package/dist/voice/interruption_detection.test.js.map +1 -0
  668. package/dist/voice/io.cjs +66 -6
  669. package/dist/voice/io.cjs.map +1 -1
  670. package/dist/voice/io.d.cts +67 -7
  671. package/dist/voice/io.d.ts +67 -7
  672. package/dist/voice/io.d.ts.map +1 -1
  673. package/dist/voice/io.js +62 -5
  674. package/dist/voice/io.js.map +1 -1
  675. package/dist/voice/recorder_io/index.cjs +23 -0
  676. package/dist/voice/recorder_io/index.cjs.map +1 -0
  677. package/dist/voice/recorder_io/index.d.cts +2 -0
  678. package/dist/voice/recorder_io/index.d.ts +2 -0
  679. package/dist/voice/recorder_io/index.d.ts.map +1 -0
  680. package/dist/voice/recorder_io/index.js +2 -0
  681. package/dist/voice/recorder_io/index.js.map +1 -0
  682. package/dist/voice/recorder_io/recorder_io.cjs +607 -0
  683. package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
  684. package/dist/voice/recorder_io/recorder_io.d.cts +106 -0
  685. package/dist/voice/recorder_io/recorder_io.d.ts +106 -0
  686. package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
  687. package/dist/voice/recorder_io/recorder_io.js +573 -0
  688. package/dist/voice/recorder_io/recorder_io.js.map +1 -0
  689. package/dist/voice/remote_session.cjs +922 -0
  690. package/dist/voice/remote_session.cjs.map +1 -0
  691. package/dist/voice/remote_session.d.cts +108 -0
  692. package/dist/voice/remote_session.d.ts +108 -0
  693. package/dist/voice/remote_session.d.ts.map +1 -0
  694. package/dist/voice/remote_session.js +887 -0
  695. package/dist/voice/remote_session.js.map +1 -0
  696. package/dist/voice/report.cjs +88 -0
  697. package/dist/voice/report.cjs.map +1 -0
  698. package/dist/voice/report.d.cts +49 -0
  699. package/dist/voice/report.d.ts +49 -0
  700. package/dist/voice/report.d.ts.map +1 -0
  701. package/dist/voice/report.js +63 -0
  702. package/dist/voice/report.js.map +1 -0
  703. package/dist/voice/report.test.cjs +121 -0
  704. package/dist/voice/report.test.cjs.map +1 -0
  705. package/dist/voice/report.test.js +120 -0
  706. package/dist/voice/report.test.js.map +1 -0
  707. package/dist/voice/room_io/_input.cjs +40 -7
  708. package/dist/voice/room_io/_input.cjs.map +1 -1
  709. package/dist/voice/room_io/_input.d.cts +5 -2
  710. package/dist/voice/room_io/_input.d.ts +5 -2
  711. package/dist/voice/room_io/_input.d.ts.map +1 -1
  712. package/dist/voice/room_io/_input.js +41 -8
  713. package/dist/voice/room_io/_input.js.map +1 -1
  714. package/dist/voice/room_io/_output.cjs +19 -11
  715. package/dist/voice/room_io/_output.cjs.map +1 -1
  716. package/dist/voice/room_io/_output.d.cts +7 -4
  717. package/dist/voice/room_io/_output.d.ts +7 -4
  718. package/dist/voice/room_io/_output.d.ts.map +1 -1
  719. package/dist/voice/room_io/_output.js +20 -12
  720. package/dist/voice/room_io/_output.js.map +1 -1
  721. package/dist/voice/room_io/room_io.cjs +33 -6
  722. package/dist/voice/room_io/room_io.cjs.map +1 -1
  723. package/dist/voice/room_io/room_io.d.cts +29 -9
  724. package/dist/voice/room_io/room_io.d.ts +29 -9
  725. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  726. package/dist/voice/room_io/room_io.js +33 -7
  727. package/dist/voice/room_io/room_io.js.map +1 -1
  728. package/dist/voice/speech_handle.cjs +22 -4
  729. package/dist/voice/speech_handle.cjs.map +1 -1
  730. package/dist/voice/speech_handle.d.cts +17 -2
  731. package/dist/voice/speech_handle.d.ts +17 -2
  732. package/dist/voice/speech_handle.d.ts.map +1 -1
  733. package/dist/voice/speech_handle.js +21 -4
  734. package/dist/voice/speech_handle.js.map +1 -1
  735. package/dist/voice/testing/fake_llm.cjs +127 -0
  736. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  737. package/dist/voice/testing/fake_llm.d.cts +30 -0
  738. package/dist/voice/testing/fake_llm.d.ts +30 -0
  739. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  740. package/dist/voice/testing/fake_llm.js +103 -0
  741. package/dist/voice/testing/fake_llm.js.map +1 -0
  742. package/dist/voice/testing/index.cjs +57 -0
  743. package/dist/voice/testing/index.cjs.map +1 -0
  744. package/dist/voice/testing/index.d.cts +21 -0
  745. package/dist/voice/testing/index.d.ts +21 -0
  746. package/dist/voice/testing/index.d.ts.map +1 -0
  747. package/dist/voice/testing/index.js +35 -0
  748. package/dist/voice/testing/index.js.map +1 -0
  749. package/dist/voice/testing/run_result.cjs +817 -0
  750. package/dist/voice/testing/run_result.cjs.map +1 -0
  751. package/dist/voice/testing/run_result.d.cts +385 -0
  752. package/dist/voice/testing/run_result.d.ts +385 -0
  753. package/dist/voice/testing/run_result.d.ts.map +1 -0
  754. package/dist/voice/testing/run_result.js +790 -0
  755. package/dist/voice/testing/run_result.js.map +1 -0
  756. package/dist/voice/testing/types.cjs +46 -0
  757. package/dist/voice/testing/types.cjs.map +1 -0
  758. package/dist/voice/testing/types.d.cts +83 -0
  759. package/dist/voice/testing/types.d.ts +83 -0
  760. package/dist/voice/testing/types.d.ts.map +1 -0
  761. package/dist/voice/testing/types.js +19 -0
  762. package/dist/voice/testing/types.js.map +1 -0
  763. package/dist/voice/transcription/synchronizer.cjs +139 -15
  764. package/dist/voice/transcription/synchronizer.cjs.map +1 -1
  765. package/dist/voice/transcription/synchronizer.d.cts +35 -4
  766. package/dist/voice/transcription/synchronizer.d.ts +35 -4
  767. package/dist/voice/transcription/synchronizer.d.ts.map +1 -1
  768. package/dist/voice/transcription/synchronizer.js +143 -16
  769. package/dist/voice/transcription/synchronizer.js.map +1 -1
  770. package/dist/voice/transcription/synchronizer.test.cjs +151 -0
  771. package/dist/voice/transcription/synchronizer.test.cjs.map +1 -0
  772. package/dist/voice/transcription/synchronizer.test.js +150 -0
  773. package/dist/voice/transcription/synchronizer.test.js.map +1 -0
  774. package/dist/voice/turn_config/endpointing.cjs +33 -0
  775. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  776. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  777. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  778. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  779. package/dist/voice/turn_config/endpointing.js +9 -0
  780. package/dist/voice/turn_config/endpointing.js.map +1 -0
  781. package/dist/voice/turn_config/interruption.cjs +37 -0
  782. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  783. package/dist/voice/turn_config/interruption.d.cts +53 -0
  784. package/dist/voice/turn_config/interruption.d.ts +53 -0
  785. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  786. package/dist/voice/turn_config/interruption.js +13 -0
  787. package/dist/voice/turn_config/interruption.js.map +1 -0
  788. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  789. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  790. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  791. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  792. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  793. package/dist/voice/turn_config/turn_handling.js +11 -0
  794. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  795. package/dist/voice/turn_config/utils.cjs +157 -0
  796. package/dist/voice/turn_config/utils.cjs.map +1 -0
  797. package/dist/voice/turn_config/utils.d.cts +37 -0
  798. package/dist/voice/turn_config/utils.d.ts +37 -0
  799. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  800. package/dist/voice/turn_config/utils.js +131 -0
  801. package/dist/voice/turn_config/utils.js.map +1 -0
  802. package/dist/voice/turn_config/utils.test.cjs +128 -0
  803. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  804. package/dist/voice/turn_config/utils.test.js +127 -0
  805. package/dist/voice/turn_config/utils.test.js.map +1 -0
  806. package/dist/voice/utils.cjs +47 -0
  807. package/dist/voice/utils.cjs.map +1 -0
  808. package/dist/voice/utils.d.cts +4 -0
  809. package/dist/voice/utils.d.ts +4 -0
  810. package/dist/voice/utils.d.ts.map +1 -0
  811. package/dist/voice/utils.js +23 -0
  812. package/dist/voice/utils.js.map +1 -0
  813. package/dist/worker.cjs +44 -52
  814. package/dist/worker.cjs.map +1 -1
  815. package/dist/worker.d.cts +18 -8
  816. package/dist/worker.d.ts +18 -8
  817. package/dist/worker.d.ts.map +1 -1
  818. package/dist/worker.js +43 -43
  819. package/dist/worker.js.map +1 -1
  820. package/package.json +35 -13
  821. package/resources/NOTICE +2 -0
  822. package/resources/keyboard-typing.ogg +0 -0
  823. package/resources/keyboard-typing2.ogg +0 -0
  824. package/resources/office-ambience.ogg +0 -0
  825. package/src/_exceptions.ts +5 -0
  826. package/src/audio.ts +132 -1
  827. package/src/beta/index.ts +9 -0
  828. package/src/beta/workflows/index.ts +9 -0
  829. package/src/beta/workflows/task_group.ts +203 -0
  830. package/src/cli.ts +57 -66
  831. package/src/connection_pool.test.ts +346 -0
  832. package/src/connection_pool.ts +307 -0
  833. package/src/constants.ts +14 -0
  834. package/src/cpu.test.ts +239 -0
  835. package/src/cpu.ts +173 -0
  836. package/src/http_server.ts +18 -6
  837. package/src/index.ts +15 -13
  838. package/src/inference/api_protos.ts +85 -2
  839. package/src/inference/index.ts +32 -4
  840. package/src/inference/interruption/defaults.ts +51 -0
  841. package/src/inference/interruption/errors.ts +25 -0
  842. package/src/inference/interruption/http_transport.ts +207 -0
  843. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  844. package/src/inference/interruption/interruption_detector.ts +204 -0
  845. package/src/inference/interruption/interruption_stream.ts +467 -0
  846. package/src/inference/interruption/types.ts +84 -0
  847. package/src/inference/interruption/utils.test.ts +132 -0
  848. package/src/inference/interruption/utils.ts +137 -0
  849. package/src/inference/interruption/ws_transport.ts +416 -0
  850. package/src/inference/llm.ts +214 -163
  851. package/src/inference/stt.test.ts +253 -0
  852. package/src/inference/stt.ts +449 -208
  853. package/src/inference/tts.test.ts +354 -0
  854. package/src/inference/tts.ts +417 -115
  855. package/src/inference/utils.ts +30 -2
  856. package/src/ipc/inference_proc_executor.ts +11 -3
  857. package/src/ipc/inference_proc_lazy_main.ts +13 -1
  858. package/src/ipc/job_proc_executor.ts +11 -1
  859. package/src/ipc/job_proc_lazy_main.ts +86 -20
  860. package/src/ipc/supervised_proc.test.ts +153 -0
  861. package/src/ipc/supervised_proc.ts +39 -10
  862. package/src/job.ts +120 -1
  863. package/src/language.test.ts +62 -0
  864. package/src/language.ts +380 -0
  865. package/src/llm/__snapshots__/zod-utils.test.ts.snap +559 -0
  866. package/src/llm/chat_context.test.ts +787 -0
  867. package/src/llm/chat_context.ts +493 -2
  868. package/src/llm/fallback_adapter.test.ts +238 -0
  869. package/src/llm/fallback_adapter.ts +394 -0
  870. package/src/llm/index.ts +13 -0
  871. package/src/llm/llm.ts +77 -12
  872. package/src/llm/provider_format/google.test.ts +72 -1
  873. package/src/llm/provider_format/google.ts +10 -6
  874. package/src/llm/provider_format/index.ts +7 -2
  875. package/src/llm/provider_format/openai.test.ts +480 -2
  876. package/src/llm/provider_format/openai.ts +152 -21
  877. package/src/llm/provider_format/utils.ts +11 -5
  878. package/src/llm/realtime.ts +23 -2
  879. package/src/llm/remote_chat_context.ts +2 -2
  880. package/src/llm/tool_context.test.ts +210 -1
  881. package/src/llm/tool_context.ts +115 -17
  882. package/src/llm/utils.test.ts +103 -2
  883. package/src/llm/utils.ts +152 -16
  884. package/src/llm/zod-utils.test.ts +577 -0
  885. package/src/llm/zod-utils.ts +153 -0
  886. package/src/log.ts +71 -19
  887. package/src/metrics/base.ts +78 -19
  888. package/src/metrics/index.ts +12 -0
  889. package/src/metrics/model_usage.test.ts +545 -0
  890. package/src/metrics/model_usage.ts +262 -0
  891. package/src/metrics/usage_collector.ts +14 -3
  892. package/src/metrics/utils.ts +27 -7
  893. package/src/stream/deferred_stream.test.ts +3 -3
  894. package/src/stream/deferred_stream.ts +43 -11
  895. package/src/stream/index.ts +1 -0
  896. package/src/stream/multi_input_stream.test.ts +545 -0
  897. package/src/stream/multi_input_stream.ts +172 -0
  898. package/src/stream/stream_channel.test.ts +37 -0
  899. package/src/stream/stream_channel.ts +43 -3
  900. package/src/stt/stream_adapter.ts +30 -9
  901. package/src/stt/stt.ts +140 -23
  902. package/src/telemetry/index.ts +28 -0
  903. package/src/telemetry/logging.ts +55 -0
  904. package/src/telemetry/otel_http_exporter.ts +218 -0
  905. package/src/telemetry/pino_otel_transport.ts +265 -0
  906. package/src/telemetry/trace_types.ts +109 -0
  907. package/src/telemetry/traces.ts +673 -0
  908. package/src/telemetry/utils.ts +61 -0
  909. package/src/tokenize/basic/sentence.ts +3 -3
  910. package/src/tokenize/tokenizer.test.ts +4 -0
  911. package/src/transcription.ts +6 -0
  912. package/src/tts/fallback_adapter.ts +586 -0
  913. package/src/tts/index.ts +1 -0
  914. package/src/tts/stream_adapter.ts +38 -8
  915. package/src/tts/tts.ts +245 -62
  916. package/src/typed_promise.ts +67 -0
  917. package/src/types.ts +62 -33
  918. package/src/utils.test.ts +90 -10
  919. package/src/utils.ts +178 -33
  920. package/src/vad.ts +42 -18
  921. package/src/version.ts +1 -1
  922. package/src/voice/agent.test.ts +347 -2
  923. package/src/voice/agent.ts +346 -44
  924. package/src/voice/agent_activity.test.ts +194 -0
  925. package/src/voice/agent_activity.ts +1457 -388
  926. package/src/voice/agent_session.ts +817 -112
  927. package/src/voice/audio_recognition.ts +845 -70
  928. package/src/voice/audio_recognition_span.test.ts +341 -0
  929. package/src/voice/avatar/datastream_io.ts +9 -1
  930. package/src/voice/background_audio.ts +494 -0
  931. package/src/voice/events.ts +27 -7
  932. package/src/voice/generation.ts +310 -56
  933. package/src/voice/generation_tools.test.ts +268 -0
  934. package/src/voice/index.ts +17 -3
  935. package/src/voice/interruption_detection.test.ts +151 -0
  936. package/src/voice/io.ts +115 -12
  937. package/src/voice/recorder_io/index.ts +4 -0
  938. package/src/voice/recorder_io/recorder_io.ts +783 -0
  939. package/src/voice/remote_session.ts +1083 -0
  940. package/src/voice/report.test.ts +136 -0
  941. package/src/voice/report.ts +140 -0
  942. package/src/voice/room_io/_input.ts +45 -10
  943. package/src/voice/room_io/_output.ts +26 -14
  944. package/src/voice/room_io/room_io.ts +67 -22
  945. package/src/voice/speech_handle.ts +38 -6
  946. package/src/voice/testing/fake_llm.ts +138 -0
  947. package/src/voice/testing/index.ts +52 -0
  948. package/src/voice/testing/run_result.ts +995 -0
  949. package/src/voice/testing/types.ts +118 -0
  950. package/src/voice/transcription/synchronizer.test.ts +206 -0
  951. package/src/voice/transcription/synchronizer.ts +204 -19
  952. package/src/voice/turn_config/endpointing.ts +33 -0
  953. package/src/voice/turn_config/interruption.ts +56 -0
  954. package/src/voice/turn_config/turn_handling.ts +45 -0
  955. package/src/voice/turn_config/utils.test.ts +148 -0
  956. package/src/voice/turn_config/utils.ts +167 -0
  957. package/src/voice/utils.ts +29 -0
  958. package/src/worker.ts +92 -78
  959. package/src/llm/__snapshots__/utils.test.ts.snap +0 -65
@@ -0,0 +1,995 @@
1
+ // SPDX-FileCopyrightText: 2025 LiveKit, Inc.
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ import { z } from 'zod';
5
+ import type { AgentHandoffItem, ChatItem, ChatRole } from '../../llm/chat_context.js';
6
+ import { ChatContext } from '../../llm/chat_context.js';
7
+ import type { LLM } from '../../llm/llm.js';
8
+ import { tool } from '../../llm/tool_context.js';
9
+ import type { Task } from '../../utils.js';
10
+ import { Future } from '../../utils.js';
11
+ import type { Agent } from '../agent.js';
12
+ import { type SpeechHandle, isSpeechHandle } from '../speech_handle.js';
13
+ import {
14
+ type AgentHandoffAssertOptions,
15
+ type AgentHandoffEvent,
16
+ type ChatMessageEvent,
17
+ type EventType,
18
+ type FunctionCallAssertOptions,
19
+ type FunctionCallEvent,
20
+ type FunctionCallOutputAssertOptions,
21
+ type FunctionCallOutputEvent,
22
+ type MessageAssertOptions,
23
+ type RunEvent,
24
+ isAgentHandoffEvent,
25
+ isChatMessageEvent,
26
+ isFunctionCallEvent,
27
+ isFunctionCallOutputEvent,
28
+ } from './types.js';
29
+
30
+ // Type for agent constructor (used in assertions)
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ type AgentConstructor = new (...args: any[]) => Agent;
33
+ // In JS we use a zod schema so runtime validation and TS generic inference stay aligned.
34
+ type OutputSchema<T> = z.ZodType<T>;
35
+
36
+ // Environment variable for verbose output
37
+ const evalsVerbose = parseInt(process.env.LIVEKIT_EVALS_VERBOSE || '0', 10);
38
+
39
+ /**
40
+ * Result of a test run containing recorded events and assertion utilities.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * const result = await session.run({ userInput: 'Hello' });
45
+ * result.expect.nextEvent().isMessage({ role: 'assistant' });
46
+ * result.expect.noMoreEvents();
47
+ * ```
48
+ */
49
+ export class RunResult<T = unknown> {
50
+ private _events: RunEvent[] = [];
51
+ private doneFut = new Future<void>();
52
+ private userInput?: string;
53
+ private outputType?: OutputSchema<T>;
54
+ private finalOutputValue?: T;
55
+ private hasFinalOutput = false;
56
+
57
+ private handles: Set<SpeechHandle | Task<void>> = new Set();
58
+ private lastSpeechHandle?: SpeechHandle;
59
+ private runAssert?: RunAssert;
60
+ // Store per-handle closures so _unwatchHandle can remove callbacks symmetrically.
61
+ private doneCallbacks = new Map<SpeechHandle | Task<void>, () => void>();
62
+
63
+ private readonly itemAddedCallback = (item: ChatItem) => this._itemAdded(item);
64
+
65
+ constructor(options?: { userInput?: string; outputType?: OutputSchema<T> }) {
66
+ this.userInput = options?.userInput;
67
+ this.outputType = options?.outputType;
68
+ }
69
+
70
+ /**
71
+ * List of all recorded events generated during the run.
72
+ */
73
+ get events(): RunEvent[] {
74
+ return this._events;
75
+ }
76
+
77
+ /**
78
+ * Provides an assertion helper for verifying the run events.
79
+ */
80
+ get expect(): RunAssert {
81
+ if (evalsVerbose) {
82
+ const eventsStr = formatEvents(this._events)
83
+ .map((line) => ` ${line}`)
84
+ .join('\n');
85
+ console.log(
86
+ `\n+ RunResult {\n userInput: "${this.userInput}"\n events: [\n${eventsStr}\n ]\n }`,
87
+ );
88
+ }
89
+
90
+ // Cache the RunAssert so cursor position persists across multiple .expect accesses
91
+ if (!this.runAssert) {
92
+ this.runAssert = new RunAssert(this);
93
+ }
94
+ return this.runAssert;
95
+ }
96
+
97
+ /**
98
+ * Returns the final output of the run after completion.
99
+ */
100
+ get finalOutput(): T {
101
+ if (!this.doneFut.done) {
102
+ throw new Error('cannot retrieve finalOutput, RunResult is not done');
103
+ }
104
+
105
+ if (!this.hasFinalOutput) {
106
+ throw new Error('no final output');
107
+ }
108
+
109
+ return this.finalOutputValue as T;
110
+ }
111
+
112
+ /**
113
+ * Indicates whether the run has finished processing all events.
114
+ */
115
+ done(): boolean {
116
+ return this.doneFut.done;
117
+ }
118
+
119
+ /**
120
+ * Wait for the RunResult to complete. Returns `this` for method chaining.
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * const result = session.run({ userInput: 'Hi!' });
125
+ * await result.wait(); // waits for completion
126
+ * result.expect.nextEvent().isMessage({ role: 'assistant' });
127
+ * ```
128
+ */
129
+ async wait(): Promise<this> {
130
+ await this.doneFut.await;
131
+ return this;
132
+ }
133
+
134
+ /**
135
+ * @internal
136
+ * Records an agent handoff event.
137
+ */
138
+ _agentHandoff(params: { item: AgentHandoffItem; oldAgent?: Agent; newAgent: Agent }): void {
139
+ const event: AgentHandoffEvent = {
140
+ type: 'agent_handoff',
141
+ item: params.item,
142
+ oldAgent: params.oldAgent,
143
+ newAgent: params.newAgent,
144
+ };
145
+ const index = this._findInsertionIndex(event.item.createdAt);
146
+ this._events.splice(index, 0, event);
147
+ }
148
+
149
+ /**
150
+ * @internal
151
+ * Called when a chat item is added during the run.
152
+ */
153
+ _itemAdded(item: ChatItem): void {
154
+ if (this.doneFut.done) {
155
+ return;
156
+ }
157
+
158
+ let event: RunEvent | undefined;
159
+
160
+ if (item.type === 'message') {
161
+ event = { type: 'message', item };
162
+ } else if (item.type === 'function_call') {
163
+ event = { type: 'function_call', item };
164
+ } else if (item.type === 'function_call_output') {
165
+ event = { type: 'function_call_output', item };
166
+ }
167
+
168
+ if (event) {
169
+ const index = this._findInsertionIndex(item.createdAt);
170
+ this._events.splice(index, 0, event);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * @internal
176
+ * Watch a speech handle or task for completion.
177
+ */
178
+ _watchHandle(handle: SpeechHandle | Task<void>): void {
179
+ if (this.handles.has(handle)) return;
180
+
181
+ this.handles.add(handle);
182
+
183
+ if (isSpeechHandle(handle)) {
184
+ handle._addItemAddedCallback(this.itemAddedCallback);
185
+ }
186
+
187
+ const doneCallback = () => this._markDoneIfNeeded(handle);
188
+
189
+ this.doneCallbacks.set(handle, doneCallback);
190
+ handle.addDoneCallback(doneCallback);
191
+ }
192
+
193
+ /**
194
+ * @internal
195
+ * Unwatch a handle.
196
+ */
197
+ _unwatchHandle(handle: SpeechHandle | Task<void>): void {
198
+ this.handles.delete(handle);
199
+ const doneCallback = this.doneCallbacks.get(handle);
200
+
201
+ if (doneCallback) {
202
+ handle.removeDoneCallback(doneCallback);
203
+ this.doneCallbacks.delete(handle);
204
+ }
205
+
206
+ if (isSpeechHandle(handle)) {
207
+ handle._removeItemAddedCallback(this.itemAddedCallback);
208
+ }
209
+ }
210
+
211
+ /** @internal */
212
+ _watchedHandleCount(): number {
213
+ return this.handles.size;
214
+ }
215
+
216
+ /** @internal – Reject the run with an error (e.g. when deferred generateReply fails). */
217
+ _reject(error: Error): void {
218
+ if (!this.doneFut.done) {
219
+ this.doneFut.reject(error);
220
+ }
221
+ }
222
+
223
+ /** @internal */
224
+ _markDoneIfNeeded(handle?: SpeechHandle | Task<void> | null): void {
225
+ if (isSpeechHandle(handle)) {
226
+ this.lastSpeechHandle = handle;
227
+ }
228
+
229
+ const allDone = [...this.handles].every((h) => (isSpeechHandle(h) ? h.done() : h.done));
230
+ if (allDone) {
231
+ this._markDone();
232
+ }
233
+ }
234
+
235
+ private _markDone(): void {
236
+ if (this.doneFut.done) {
237
+ return;
238
+ }
239
+
240
+ if (!this.lastSpeechHandle) {
241
+ this.doneFut.resolve();
242
+ return;
243
+ }
244
+
245
+ const finalOutput = this.lastSpeechHandle._maybeRunFinalOutput;
246
+ if (finalOutput instanceof Error) {
247
+ this.doneFut.reject(finalOutput);
248
+ return;
249
+ }
250
+
251
+ if (this.outputType) {
252
+ const result = this.outputType.safeParse(finalOutput);
253
+ if (!result.success) {
254
+ this.doneFut.reject(
255
+ new Error(`Expected output matching provided zod schema: ${result.error.message}`),
256
+ );
257
+ return;
258
+ }
259
+ this.finalOutputValue = result.data;
260
+ this.hasFinalOutput = true;
261
+ this.doneFut.resolve();
262
+ return;
263
+ }
264
+
265
+ if (finalOutput !== undefined) {
266
+ this.finalOutputValue = finalOutput as T;
267
+ this.hasFinalOutput = true;
268
+ }
269
+ this.doneFut.resolve();
270
+ }
271
+
272
+ /**
273
+ * Find the correct insertion index to maintain chronological order.
274
+ */
275
+ private _findInsertionIndex(createdAt: number): number {
276
+ for (let i = this._events.length - 1; i >= 0; i--) {
277
+ if (this._events[i]!.item.createdAt <= createdAt) {
278
+ return i + 1;
279
+ }
280
+ }
281
+ return 0;
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Assertion helper for verifying run events in sequence.
287
+ */
288
+ export class RunAssert {
289
+ private _events: RunEvent[];
290
+ private _currentIndex = 0;
291
+
292
+ constructor(runResult: RunResult) {
293
+ this._events = runResult.events;
294
+ }
295
+
296
+ /**
297
+ * Access a specific event by index for assertions.
298
+ * Supports negative indices (e.g., -1 for last event).
299
+ *
300
+ * @example
301
+ * ```typescript
302
+ * result.expect.at(0).isMessage({ role: 'user' });
303
+ * result.expect.at(-1).isMessage({ role: 'assistant' });
304
+ * ```
305
+ */
306
+ at(index: number): EventAssert {
307
+ let normalizedIndex = index;
308
+ if (index < 0) {
309
+ normalizedIndex = this._events.length + index;
310
+ }
311
+
312
+ if (normalizedIndex < 0 || normalizedIndex >= this._events.length) {
313
+ this._raiseWithDebugInfo(
314
+ `at(${index}) out of range (total events: ${this._events.length})`,
315
+ normalizedIndex,
316
+ );
317
+ }
318
+
319
+ return new EventAssert(this._events[normalizedIndex]!, this, normalizedIndex);
320
+ }
321
+
322
+ /**
323
+ * Advance to the next event, optionally filtering by type.
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * result.expect.nextEvent().isMessage({ role: 'assistant' });
328
+ * result.expect.nextEvent({ type: 'function_call' }).isFunctionCall({ name: 'foo' });
329
+ * ```
330
+ */
331
+ nextEvent(options?: { type?: EventType }): EventAssert {
332
+ while (true) {
333
+ const evAssert = this._currentEvent();
334
+ this._currentIndex++;
335
+
336
+ if (!options?.type || evAssert.event().type === options.type) {
337
+ return evAssert;
338
+ }
339
+ }
340
+ }
341
+
342
+ /**
343
+ * Skip a specified number of upcoming events without assertions.
344
+ *
345
+ * @example
346
+ * ```typescript
347
+ * result.expect.skipNext(2);
348
+ * ```
349
+ */
350
+ skipNext(count: number = 1): this {
351
+ for (let i = 0; i < count; i++) {
352
+ if (this._currentIndex >= this._events.length) {
353
+ this._raiseWithDebugInfo(`Tried to skip ${count} event(s), but only ${i} were available.`);
354
+ }
355
+ this._currentIndex++;
356
+ }
357
+ return this;
358
+ }
359
+
360
+ /**
361
+ * Conditionally skip the next event if it matches the specified criteria.
362
+ * Returns the event assertion if matched and skipped, or undefined if not matched.
363
+ *
364
+ * @example
365
+ * ```typescript
366
+ * // Skip optional assistant message before function call
367
+ * result.expect.skipNextEventIf({ type: 'message', role: 'assistant' });
368
+ * result.expect.nextEvent().isFunctionCall({ name: 'foo' });
369
+ * ```
370
+ */
371
+ skipNextEventIf(
372
+ options:
373
+ | { type: 'message'; role?: ChatRole }
374
+ | { type: 'function_call'; name?: string; args?: Record<string, unknown> }
375
+ | { type: 'function_call_output'; output?: string; isError?: boolean }
376
+ | { type: 'agent_handoff'; newAgentType?: AgentConstructor },
377
+ ):
378
+ | MessageAssert
379
+ | FunctionCallAssert
380
+ | FunctionCallOutputAssert
381
+ | AgentHandoffAssert
382
+ | undefined {
383
+ if (this._currentIndex >= this._events.length) {
384
+ return undefined;
385
+ }
386
+
387
+ try {
388
+ const evAssert = this._currentEvent();
389
+
390
+ if (options.type === 'message') {
391
+ const { role } = options;
392
+ const result = evAssert.isMessage({ role });
393
+ this._currentIndex++;
394
+ return result;
395
+ } else if (options.type === 'function_call') {
396
+ const { name, args } = options;
397
+ const result = evAssert.isFunctionCall({
398
+ name,
399
+ args,
400
+ });
401
+ this._currentIndex++;
402
+ return result;
403
+ } else if (options.type === 'function_call_output') {
404
+ const { output, isError } = options;
405
+ const result = evAssert.isFunctionCallOutput({
406
+ output,
407
+ isError,
408
+ });
409
+ this._currentIndex++;
410
+ return result;
411
+ } else if (options.type === 'agent_handoff') {
412
+ const { newAgentType } = options;
413
+ const result = evAssert.isAgentHandoff({ newAgentType });
414
+ this._currentIndex++;
415
+ return result;
416
+ }
417
+ } catch {
418
+ // Assertion failed, event doesn't match criteria
419
+ return undefined;
420
+ }
421
+
422
+ return undefined;
423
+ }
424
+
425
+ /**
426
+ * Get an EventRangeAssert for a range of events.
427
+ * Similar to Python's slice access: expect[0:3] or expect[:]
428
+ *
429
+ * @param start - Start index (inclusive), defaults to 0
430
+ * @param end - End index (exclusive), defaults to events.length
431
+ *
432
+ * @example
433
+ * ```typescript
434
+ * // Search all events
435
+ * result.expect.range().containsFunctionCall({ name: 'foo' });
436
+ * // Search first 3 events
437
+ * result.expect.range(0, 3).containsMessage({ role: 'assistant' });
438
+ * ```
439
+ */
440
+ range(start?: number, end?: number): EventRangeAssert {
441
+ const startIdx = start ?? 0;
442
+ const endIdx = end ?? this._events.length;
443
+ const events = this._events.slice(startIdx, endIdx);
444
+ return new EventRangeAssert(events, this, { start: startIdx, end: endIdx });
445
+ }
446
+
447
+ /**
448
+ * Assert that a function call matching criteria exists anywhere in the events.
449
+ *
450
+ * @example
451
+ * ```typescript
452
+ * result.expect.containsFunctionCall({ name: 'order_item' });
453
+ * ```
454
+ */
455
+ containsFunctionCall(options?: FunctionCallAssertOptions): FunctionCallAssert {
456
+ return this.range().containsFunctionCall(options);
457
+ }
458
+
459
+ /**
460
+ * Assert that a message matching criteria exists anywhere in the events.
461
+ *
462
+ * @example
463
+ * ```typescript
464
+ * result.expect.containsMessage({ role: 'assistant' });
465
+ * ```
466
+ */
467
+ containsMessage(options?: MessageAssertOptions): MessageAssert {
468
+ return this.range().containsMessage(options);
469
+ }
470
+
471
+ /**
472
+ * Assert that a function call output matching criteria exists anywhere in the events.
473
+ *
474
+ * @example
475
+ * ```typescript
476
+ * result.expect.containsFunctionCallOutput({ isError: false });
477
+ * ```
478
+ */
479
+ containsFunctionCallOutput(options?: FunctionCallOutputAssertOptions): FunctionCallOutputAssert {
480
+ return this.range().containsFunctionCallOutput(options);
481
+ }
482
+
483
+ /**
484
+ * Assert that an agent handoff matching criteria exists anywhere in the events.
485
+ *
486
+ * @example
487
+ * ```typescript
488
+ * result.expect.containsAgentHandoff({ newAgentType: MyAgent });
489
+ * ```
490
+ */
491
+ containsAgentHandoff(options?: AgentHandoffAssertOptions): AgentHandoffAssert {
492
+ return this.range().containsAgentHandoff(options);
493
+ }
494
+
495
+ /**
496
+ * Assert that there are no further events.
497
+ *
498
+ * @example
499
+ * ```typescript
500
+ * result.expect.noMoreEvents();
501
+ * ```
502
+ */
503
+ noMoreEvents(): void {
504
+ if (this._currentIndex < this._events.length) {
505
+ const event = this._events[this._currentIndex]!;
506
+ this._raiseWithDebugInfo(`Expected no more events, but found: ${event.type}`);
507
+ }
508
+ }
509
+
510
+ private _currentEvent(): EventAssert {
511
+ if (this._currentIndex >= this._events.length) {
512
+ this._raiseWithDebugInfo('Expected another event, but none left.');
513
+ }
514
+ return this.at(this._currentIndex);
515
+ }
516
+
517
+ /** @internal */
518
+ _raiseWithDebugInfo(message: string, index?: number): never {
519
+ const markerIndex = index ?? this._currentIndex;
520
+ const eventsStr = formatEvents(this._events, markerIndex).join('\n');
521
+ throw new AssertionError(`${message}\nContext around failure:\n${eventsStr}`);
522
+ }
523
+ }
524
+
525
+ /**
526
+ * Assertion wrapper for a single event.
527
+ */
528
+ export class EventAssert {
529
+ protected _event: RunEvent;
530
+ protected _parent: RunAssert;
531
+ protected _index: number;
532
+
533
+ constructor(event: RunEvent, parent: RunAssert, index: number) {
534
+ this._event = event;
535
+ this._parent = parent;
536
+ this._index = index;
537
+ }
538
+
539
+ /**
540
+ * Get the underlying event.
541
+ */
542
+ event(): RunEvent {
543
+ return this._event;
544
+ }
545
+
546
+ protected _raise(message: string): never {
547
+ this._parent._raiseWithDebugInfo(message, this._index);
548
+ }
549
+
550
+ /**
551
+ * Verify this event is a message with optional role matching.
552
+ *
553
+ * @example
554
+ * ```typescript
555
+ * result.expect.nextEvent().isMessage({ role: 'assistant' });
556
+ * ```
557
+ */
558
+ isMessage(options?: MessageAssertOptions): MessageAssert {
559
+ if (!isChatMessageEvent(this._event)) {
560
+ this._raise(`Expected ChatMessageEvent, got ${this._event.type}`);
561
+ }
562
+
563
+ if (options?.role && this._event.item.role !== options.role) {
564
+ this._raise(`Expected role '${options.role}', got '${this._event.item.role}'`);
565
+ }
566
+
567
+ return new MessageAssert(this._event, this._parent, this._index);
568
+ }
569
+
570
+ /**
571
+ * Verify this event is a function call with optional name/args matching.
572
+ *
573
+ * @example
574
+ * ```typescript
575
+ * result.expect.nextEvent().isFunctionCall({ name: 'order_item', args: { id: 'big_mac' } });
576
+ * ```
577
+ */
578
+ isFunctionCall(options?: FunctionCallAssertOptions): FunctionCallAssert {
579
+ if (!isFunctionCallEvent(this._event)) {
580
+ this._raise(`Expected FunctionCallEvent, got ${this._event.type}`);
581
+ }
582
+
583
+ if (options?.name && this._event.item.name !== options.name) {
584
+ this._raise(`Expected call name '${options.name}', got '${this._event.item.name}'`);
585
+ }
586
+
587
+ if (options?.args) {
588
+ let actual: Record<string, unknown>;
589
+ try {
590
+ actual = JSON.parse(this._event.item.args);
591
+ } catch {
592
+ this._raise(`Failed to parse function call arguments: ${this._event.item.args}`);
593
+ }
594
+
595
+ for (const [key, value] of Object.entries(options.args)) {
596
+ if (!(key in actual) || actual[key] !== value) {
597
+ this._raise(
598
+ `For key '${key}', expected ${JSON.stringify(value)}, got ${JSON.stringify(actual[key])}`,
599
+ );
600
+ }
601
+ }
602
+ }
603
+
604
+ return new FunctionCallAssert(this._event, this._parent, this._index);
605
+ }
606
+
607
+ /**
608
+ * Verify this event is a function call output with optional matching.
609
+ *
610
+ * @example
611
+ * ```typescript
612
+ * result.expect.nextEvent().isFunctionCallOutput({ isError: false });
613
+ * ```
614
+ */
615
+ isFunctionCallOutput(options?: FunctionCallOutputAssertOptions): FunctionCallOutputAssert {
616
+ if (!isFunctionCallOutputEvent(this._event)) {
617
+ this._raise(`Expected FunctionCallOutputEvent, got ${this._event.type}`);
618
+ }
619
+
620
+ if (options?.output !== undefined && this._event.item.output !== options.output) {
621
+ this._raise(`Expected output '${options.output}', got '${this._event.item.output}'`);
622
+ }
623
+
624
+ if (options?.isError !== undefined && this._event.item.isError !== options.isError) {
625
+ this._raise(`Expected isError=${options.isError}, got ${this._event.item.isError}`);
626
+ }
627
+
628
+ return new FunctionCallOutputAssert(this._event, this._parent, this._index);
629
+ }
630
+
631
+ /**
632
+ * Verify this event is an agent handoff with optional type matching.
633
+ *
634
+ * @example
635
+ * ```typescript
636
+ * result.expect.nextEvent().isAgentHandoff({ newAgentType: MyAgent });
637
+ * ```
638
+ */
639
+ isAgentHandoff(options?: AgentHandoffAssertOptions): AgentHandoffAssert {
640
+ if (!isAgentHandoffEvent(this._event)) {
641
+ this._raise(`Expected AgentHandoffEvent, got ${this._event.type}`);
642
+ }
643
+
644
+ const event = this._event;
645
+
646
+ if (options?.newAgentType) {
647
+ const actualType = event.newAgent.constructor.name;
648
+ if (!(event.newAgent instanceof options.newAgentType)) {
649
+ this._raise(`Expected new_agent '${options.newAgentType.name}', got '${actualType}'`);
650
+ }
651
+ }
652
+
653
+ return new AgentHandoffAssert(event, this._parent, this._index);
654
+ }
655
+ }
656
+
657
+ /**
658
+ * Assertion wrapper for a range of events.
659
+ * Provides contains*() methods to search within the range.
660
+ */
661
+ export class EventRangeAssert {
662
+ private _events: RunEvent[];
663
+ private _parent: RunAssert;
664
+ private _range: { start: number; end: number };
665
+
666
+ constructor(events: RunEvent[], parent: RunAssert, range: { start: number; end: number }) {
667
+ this._events = events;
668
+ this._parent = parent;
669
+ this._range = range;
670
+ }
671
+
672
+ /**
673
+ * Assert that a function call matching criteria exists in this event range.
674
+ *
675
+ * @example
676
+ * ```typescript
677
+ * result.expect.range(0, 3).containsFunctionCall({ name: 'foo' });
678
+ * ```
679
+ */
680
+ containsFunctionCall(options?: FunctionCallAssertOptions): FunctionCallAssert {
681
+ for (let idx = 0; idx < this._events.length; idx++) {
682
+ const ev = this._events[idx]!;
683
+ const candidate = new EventAssert(ev, this._parent, this._range.start + idx);
684
+ try {
685
+ return candidate.isFunctionCall(options);
686
+ } catch {
687
+ // Continue searching
688
+ }
689
+ }
690
+
691
+ this._parent._raiseWithDebugInfo(
692
+ `No FunctionCallEvent satisfying criteria found in range [${this._range.start}:${this._range.end}]`,
693
+ );
694
+ }
695
+
696
+ /**
697
+ * Assert that a message matching criteria exists in this event range.
698
+ *
699
+ * @example
700
+ * ```typescript
701
+ * result.expect.range(0, 2).containsMessage({ role: 'assistant' });
702
+ * ```
703
+ */
704
+ containsMessage(options?: MessageAssertOptions): MessageAssert {
705
+ for (let idx = 0; idx < this._events.length; idx++) {
706
+ const ev = this._events[idx]!;
707
+ const candidate = new EventAssert(ev, this._parent, this._range.start + idx);
708
+ try {
709
+ return candidate.isMessage(options);
710
+ } catch {
711
+ // Continue searching
712
+ }
713
+ }
714
+
715
+ this._parent._raiseWithDebugInfo(
716
+ `No ChatMessageEvent matching criteria found in range [${this._range.start}:${this._range.end}]`,
717
+ );
718
+ }
719
+
720
+ /**
721
+ * Assert that a function call output matching criteria exists in this event range.
722
+ *
723
+ * @example
724
+ * ```typescript
725
+ * result.expect.range(1, 4).containsFunctionCallOutput({ isError: true });
726
+ * ```
727
+ */
728
+ containsFunctionCallOutput(options?: FunctionCallOutputAssertOptions): FunctionCallOutputAssert {
729
+ for (let idx = 0; idx < this._events.length; idx++) {
730
+ const ev = this._events[idx]!;
731
+ const candidate = new EventAssert(ev, this._parent, this._range.start + idx);
732
+ try {
733
+ return candidate.isFunctionCallOutput(options);
734
+ } catch {
735
+ // Continue searching
736
+ }
737
+ }
738
+
739
+ this._parent._raiseWithDebugInfo(
740
+ `No FunctionCallOutputEvent matching criteria found in range [${this._range.start}:${this._range.end}]`,
741
+ );
742
+ }
743
+
744
+ /**
745
+ * Assert that an agent handoff matching criteria exists in this event range.
746
+ *
747
+ * @example
748
+ * ```typescript
749
+ * result.expect.range(0, 3).containsAgentHandoff({ newAgentType: MyAgent });
750
+ * ```
751
+ */
752
+ containsAgentHandoff(options?: AgentHandoffAssertOptions): AgentHandoffAssert {
753
+ for (let idx = 0; idx < this._events.length; idx++) {
754
+ const ev = this._events[idx]!;
755
+ const candidate = new EventAssert(ev, this._parent, this._range.start + idx);
756
+ try {
757
+ return candidate.isAgentHandoff(options);
758
+ } catch {
759
+ // Continue searching
760
+ }
761
+ }
762
+
763
+ this._parent._raiseWithDebugInfo(
764
+ `No AgentHandoffEvent matching criteria found in range [${this._range.start}:${this._range.end}]`,
765
+ );
766
+ }
767
+ }
768
+
769
+ /**
770
+ * Assertion wrapper for message events.
771
+ */
772
+ export class MessageAssert extends EventAssert {
773
+ protected declare _event: ChatMessageEvent;
774
+
775
+ constructor(event: ChatMessageEvent, parent: RunAssert, index: number) {
776
+ super(event, parent, index);
777
+ }
778
+
779
+ override event(): ChatMessageEvent {
780
+ return this._event;
781
+ }
782
+
783
+ /**
784
+ * Evaluate whether the message fulfills the given intent using an LLM.
785
+ *
786
+ * @param llm - LLM instance for judgment
787
+ * @param options - Options containing the intent description
788
+ * @returns Self for chaining further assertions
789
+ *
790
+ * @example
791
+ * ```typescript
792
+ * await result.expect
793
+ * .nextEvent()
794
+ * .isMessage({ role: 'assistant' })
795
+ * .judge(llm, { intent: 'should ask for the drink size' });
796
+ * ```
797
+ */
798
+ async judge(llm: LLM, options: { intent: string }): Promise<MessageAssert> {
799
+ const { intent } = options;
800
+
801
+ // Extract text content from message
802
+ const content = this._event.item.content;
803
+ const msgContent =
804
+ typeof content === 'string'
805
+ ? content
806
+ : Array.isArray(content)
807
+ ? content.filter((c): c is string => typeof c === 'string').join(' ')
808
+ : '';
809
+
810
+ if (!msgContent) {
811
+ this._raise('The chat message is empty.');
812
+ }
813
+
814
+ if (!intent) {
815
+ this._raise('Intent is required to judge the message.');
816
+ }
817
+
818
+ // Create the check_intent tool
819
+ const checkIntentTool = tool({
820
+ description:
821
+ 'Determines whether the message correctly fulfills the given intent. ' +
822
+ 'Returns success=true if the message satisfies the intent, false otherwise. ' +
823
+ 'Provide a concise reason justifying the result.',
824
+ parameters: z.object({
825
+ success: z.boolean().describe('Whether the message satisfies the intent'),
826
+ reason: z.string().describe('A concise explanation justifying the result'),
827
+ }),
828
+ execute: async ({ success, reason }: { success: boolean; reason: string }) => {
829
+ return { success, reason };
830
+ },
831
+ });
832
+
833
+ // Create chat context for the judge
834
+ const chatCtx = ChatContext.empty();
835
+ chatCtx.addMessage({
836
+ role: 'system',
837
+ content:
838
+ 'You are a test evaluator for conversational agents.\n' +
839
+ 'You will be shown a message and a target intent. Determine whether the message accomplishes the intent.\n' +
840
+ 'Only respond by calling the `check_intent(success: bool, reason: str)` function with your final judgment.\n' +
841
+ 'Be strict: if the message does not clearly fulfill the intent, return `success = false` and explain why.',
842
+ });
843
+ chatCtx.addMessage({
844
+ role: 'user',
845
+ content:
846
+ 'Check if the following message fulfills the given intent.\n\n' +
847
+ `Intent:\n${intent}\n\n` +
848
+ `Message:\n${msgContent}`,
849
+ });
850
+
851
+ // Call the LLM with the check_intent tool
852
+ let toolArgs: { success: boolean; reason: string } | undefined;
853
+
854
+ const stream = llm.chat({
855
+ chatCtx,
856
+ toolCtx: { check_intent: checkIntentTool },
857
+ toolChoice: { type: 'function', function: { name: 'check_intent' } },
858
+ extraKwargs: { temperature: 0 },
859
+ });
860
+
861
+ for await (const chunk of stream) {
862
+ if (!chunk.delta) continue;
863
+
864
+ if (chunk.delta.toolCalls && chunk.delta.toolCalls.length > 0) {
865
+ const toolCall = chunk.delta.toolCalls[0]!;
866
+ if (toolCall.args) {
867
+ try {
868
+ toolArgs = JSON.parse(toolCall.args);
869
+ } catch {
870
+ // Args might be streamed incrementally, keep the last valid parse
871
+ }
872
+ }
873
+ }
874
+ }
875
+
876
+ if (!toolArgs) {
877
+ this._raise('LLM did not return any arguments for evaluation.');
878
+ }
879
+
880
+ const { success, reason } = toolArgs;
881
+
882
+ if (!success) {
883
+ this._raise(`Judgment failed: ${reason}`);
884
+ } else if (evalsVerbose) {
885
+ const printMsg =
886
+ msgContent.length > 30 ? msgContent.slice(0, 30).replace(/\n/g, '\\n') + '...' : msgContent;
887
+ console.log(`- Judgment succeeded for \`${printMsg}\`: \`${reason}\``);
888
+ }
889
+
890
+ return this;
891
+ }
892
+ }
893
+
894
+ /**
895
+ * Assertion wrapper for function call events.
896
+ */
897
+ export class FunctionCallAssert extends EventAssert {
898
+ protected declare _event: FunctionCallEvent;
899
+
900
+ constructor(event: FunctionCallEvent, parent: RunAssert, index: number) {
901
+ super(event, parent, index);
902
+ }
903
+
904
+ override event(): FunctionCallEvent {
905
+ return this._event;
906
+ }
907
+ }
908
+
909
+ /**
910
+ * Assertion wrapper for function call output events.
911
+ */
912
+ export class FunctionCallOutputAssert extends EventAssert {
913
+ protected declare _event: FunctionCallOutputEvent;
914
+
915
+ constructor(event: FunctionCallOutputEvent, parent: RunAssert, index: number) {
916
+ super(event, parent, index);
917
+ }
918
+
919
+ override event(): FunctionCallOutputEvent {
920
+ return this._event;
921
+ }
922
+ }
923
+
924
+ /**
925
+ * Assertion wrapper for agent handoff events.
926
+ */
927
+ export class AgentHandoffAssert extends EventAssert {
928
+ protected declare _event: AgentHandoffEvent;
929
+
930
+ constructor(event: AgentHandoffEvent, parent: RunAssert, index: number) {
931
+ super(event, parent, index);
932
+ }
933
+
934
+ override event(): AgentHandoffEvent {
935
+ return this._event;
936
+ }
937
+ }
938
+
939
+ /**
940
+ * Custom assertion error for test failures.
941
+ */
942
+ export class AssertionError extends Error {
943
+ constructor(message: string) {
944
+ super(message);
945
+ this.name = 'AssertionError';
946
+ Error.captureStackTrace?.(this, AssertionError);
947
+ }
948
+ }
949
+
950
+ // TODO: mockTools() utility for mocking tool implementations in tests
951
+ // Will be implemented for test suites.
952
+ // See Python run_result.py lines 1010-1031 for reference.
953
+
954
+ /**
955
+ * Format events for debug output, optionally marking a selected index.
956
+ */
957
+ function formatEvents(events: RunEvent[], selectedIndex?: number): string[] {
958
+ const lines: string[] = [];
959
+
960
+ for (let i = 0; i < events.length; i++) {
961
+ const event = events[i]!;
962
+ let prefix = '';
963
+ if (selectedIndex !== undefined) {
964
+ prefix = i === selectedIndex ? '>>>' : ' ';
965
+ }
966
+
967
+ let line: string;
968
+ if (isChatMessageEvent(event)) {
969
+ const { role, content, interrupted } = event.item;
970
+ const textContent =
971
+ typeof content === 'string'
972
+ ? content
973
+ : Array.isArray(content)
974
+ ? content.filter((c): c is string => typeof c === 'string').join(' ')
975
+ : '';
976
+ const truncated = textContent.length > 50 ? textContent.slice(0, 50) + '...' : textContent;
977
+ line = `${prefix}[${i}] { type: "message", role: "${role}", content: "${truncated}", interrupted: ${interrupted} }`;
978
+ } else if (isFunctionCallEvent(event)) {
979
+ const { name, args } = event.item;
980
+ line = `${prefix}[${i}] { type: "function_call", name: "${name}", args: ${args} }`;
981
+ } else if (isFunctionCallOutputEvent(event)) {
982
+ const { output, isError } = event.item;
983
+ const truncated = output.length > 50 ? output.slice(0, 50) + '...' : output;
984
+ line = `${prefix}[${i}] { type: "function_call_output", output: "${truncated}", isError: ${isError} }`;
985
+ } else if (isAgentHandoffEvent(event)) {
986
+ line = `${prefix}[${i}] { type: "agent_handoff", oldAgent: "${event.oldAgent?.constructor.name}", newAgent: "${event.newAgent.constructor.name}" }`;
987
+ } else {
988
+ line = `${prefix}[${i}] ${event}`;
989
+ }
990
+
991
+ lines.push(line);
992
+ }
993
+
994
+ return lines;
995
+ }