@livekit/agents 1.1.0 → 1.2.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 (942) hide show
  1. package/dist/audio.cjs +89 -3
  2. package/dist/audio.cjs.map +1 -1
  3. package/dist/audio.d.cts +36 -1
  4. package/dist/audio.d.ts +36 -1
  5. package/dist/audio.d.ts.map +1 -1
  6. package/dist/audio.js +76 -2
  7. package/dist/audio.js.map +1 -1
  8. package/dist/beta/index.cjs +29 -0
  9. package/dist/beta/index.cjs.map +1 -0
  10. package/dist/beta/index.d.cts +2 -0
  11. package/dist/beta/index.d.ts +2 -0
  12. package/dist/beta/index.d.ts.map +1 -0
  13. package/dist/beta/index.js +7 -0
  14. package/dist/beta/index.js.map +1 -0
  15. package/dist/beta/workflows/index.cjs +29 -0
  16. package/dist/beta/workflows/index.cjs.map +1 -0
  17. package/dist/beta/workflows/index.d.cts +2 -0
  18. package/dist/beta/workflows/index.d.ts +2 -0
  19. package/dist/beta/workflows/index.d.ts.map +1 -0
  20. package/dist/beta/workflows/index.js +7 -0
  21. package/dist/beta/workflows/index.js.map +1 -0
  22. package/dist/beta/workflows/task_group.cjs +162 -0
  23. package/dist/beta/workflows/task_group.cjs.map +1 -0
  24. package/dist/beta/workflows/task_group.d.cts +32 -0
  25. package/dist/beta/workflows/task_group.d.ts +32 -0
  26. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  27. package/dist/beta/workflows/task_group.js +138 -0
  28. package/dist/beta/workflows/task_group.js.map +1 -0
  29. package/dist/cli.cjs +44 -46
  30. package/dist/cli.cjs.map +1 -1
  31. package/dist/cli.d.cts +3 -3
  32. package/dist/cli.d.ts +3 -3
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +45 -47
  35. package/dist/cli.js.map +1 -1
  36. package/dist/connection_pool.cjs +242 -0
  37. package/dist/connection_pool.cjs.map +1 -0
  38. package/dist/connection_pool.d.cts +123 -0
  39. package/dist/connection_pool.d.ts +123 -0
  40. package/dist/connection_pool.d.ts.map +1 -0
  41. package/dist/connection_pool.js +218 -0
  42. package/dist/connection_pool.js.map +1 -0
  43. package/dist/connection_pool.test.cjs +256 -0
  44. package/dist/connection_pool.test.cjs.map +1 -0
  45. package/dist/connection_pool.test.js +255 -0
  46. package/dist/connection_pool.test.js.map +1 -0
  47. package/dist/constants.cjs +30 -0
  48. package/dist/constants.cjs.map +1 -1
  49. package/dist/constants.d.cts +10 -0
  50. package/dist/constants.d.ts +10 -0
  51. package/dist/constants.d.ts.map +1 -1
  52. package/dist/constants.js +20 -0
  53. package/dist/constants.js.map +1 -1
  54. package/dist/cpu.cjs +189 -0
  55. package/dist/cpu.cjs.map +1 -0
  56. package/dist/cpu.d.cts +24 -0
  57. package/dist/cpu.d.ts +24 -0
  58. package/dist/cpu.d.ts.map +1 -0
  59. package/dist/cpu.js +152 -0
  60. package/dist/cpu.js.map +1 -0
  61. package/dist/cpu.test.cjs +227 -0
  62. package/dist/cpu.test.cjs.map +1 -0
  63. package/dist/cpu.test.js +204 -0
  64. package/dist/cpu.test.js.map +1 -0
  65. package/dist/http_server.cjs +9 -6
  66. package/dist/http_server.cjs.map +1 -1
  67. package/dist/http_server.d.cts +5 -1
  68. package/dist/http_server.d.ts +5 -1
  69. package/dist/http_server.d.ts.map +1 -1
  70. package/dist/http_server.js +9 -6
  71. package/dist/http_server.js.map +1 -1
  72. package/dist/index.cjs +24 -9
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +15 -11
  75. package/dist/index.d.ts +15 -11
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +18 -9
  78. package/dist/index.js.map +1 -1
  79. package/dist/inference/api_protos.cjs +70 -2
  80. package/dist/inference/api_protos.cjs.map +1 -1
  81. package/dist/inference/api_protos.d.cts +373 -32
  82. package/dist/inference/api_protos.d.ts +373 -32
  83. package/dist/inference/api_protos.d.ts.map +1 -1
  84. package/dist/inference/api_protos.js +62 -2
  85. package/dist/inference/api_protos.js.map +1 -1
  86. package/dist/inference/index.cjs +8 -0
  87. package/dist/inference/index.cjs.map +1 -1
  88. package/dist/inference/index.d.cts +3 -4
  89. package/dist/inference/index.d.ts +3 -4
  90. package/dist/inference/index.d.ts.map +1 -1
  91. package/dist/inference/index.js +18 -3
  92. package/dist/inference/index.js.map +1 -1
  93. package/dist/inference/interruption/defaults.cjs +81 -0
  94. package/dist/inference/interruption/defaults.cjs.map +1 -0
  95. package/dist/inference/interruption/defaults.d.cts +19 -0
  96. package/dist/inference/interruption/defaults.d.ts +19 -0
  97. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  98. package/dist/inference/interruption/defaults.js +46 -0
  99. package/dist/inference/interruption/defaults.js.map +1 -0
  100. package/dist/inference/interruption/errors.cjs +44 -0
  101. package/dist/inference/interruption/errors.cjs.map +1 -0
  102. package/dist/inference/interruption/errors.d.cts +12 -0
  103. package/dist/inference/interruption/errors.d.ts +12 -0
  104. package/dist/inference/interruption/errors.d.ts.map +1 -0
  105. package/dist/inference/interruption/errors.js +20 -0
  106. package/dist/inference/interruption/errors.js.map +1 -0
  107. package/dist/inference/interruption/http_transport.cjs +163 -0
  108. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  109. package/dist/inference/interruption/http_transport.d.cts +63 -0
  110. package/dist/inference/interruption/http_transport.d.ts +63 -0
  111. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  112. package/dist/inference/interruption/http_transport.js +137 -0
  113. package/dist/inference/interruption/http_transport.js.map +1 -0
  114. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  115. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  116. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  117. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  118. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  119. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  120. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  121. package/dist/inference/interruption/interruption_detector.cjs +198 -0
  122. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  123. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  124. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  125. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  126. package/dist/inference/interruption/interruption_detector.js +164 -0
  127. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  128. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  129. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  130. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  131. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  132. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  133. package/dist/inference/interruption/interruption_stream.js +344 -0
  134. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  135. package/dist/inference/interruption/types.cjs +17 -0
  136. package/dist/inference/interruption/types.cjs.map +1 -0
  137. package/dist/inference/interruption/types.d.cts +66 -0
  138. package/dist/inference/interruption/types.d.ts +66 -0
  139. package/dist/inference/interruption/types.d.ts.map +1 -0
  140. package/dist/inference/interruption/types.js +1 -0
  141. package/dist/inference/interruption/types.js.map +1 -0
  142. package/dist/inference/interruption/utils.cjs +130 -0
  143. package/dist/inference/interruption/utils.cjs.map +1 -0
  144. package/dist/inference/interruption/utils.d.cts +41 -0
  145. package/dist/inference/interruption/utils.d.ts +41 -0
  146. package/dist/inference/interruption/utils.d.ts.map +1 -0
  147. package/dist/inference/interruption/utils.js +105 -0
  148. package/dist/inference/interruption/utils.js.map +1 -0
  149. package/dist/inference/interruption/utils.test.cjs +105 -0
  150. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  151. package/dist/inference/interruption/utils.test.js +104 -0
  152. package/dist/inference/interruption/utils.test.js.map +1 -0
  153. package/dist/inference/interruption/ws_transport.cjs +342 -0
  154. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  155. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  156. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  157. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  158. package/dist/inference/interruption/ws_transport.js +308 -0
  159. package/dist/inference/interruption/ws_transport.js.map +1 -0
  160. package/dist/inference/llm.cjs +106 -66
  161. package/dist/inference/llm.cjs.map +1 -1
  162. package/dist/inference/llm.d.cts +65 -43
  163. package/dist/inference/llm.d.ts +65 -43
  164. package/dist/inference/llm.d.ts.map +1 -1
  165. package/dist/inference/llm.js +100 -66
  166. package/dist/inference/llm.js.map +1 -1
  167. package/dist/inference/stt.cjs +319 -170
  168. package/dist/inference/stt.cjs.map +1 -1
  169. package/dist/inference/stt.d.cts +64 -15
  170. package/dist/inference/stt.d.ts +64 -15
  171. package/dist/inference/stt.d.ts.map +1 -1
  172. package/dist/inference/stt.js +319 -170
  173. package/dist/inference/stt.js.map +1 -1
  174. package/dist/inference/stt.test.cjs +218 -0
  175. package/dist/inference/stt.test.cjs.map +1 -0
  176. package/dist/inference/stt.test.js +217 -0
  177. package/dist/inference/stt.test.js.map +1 -0
  178. package/dist/inference/tts.cjs +249 -71
  179. package/dist/inference/tts.cjs.map +1 -1
  180. package/dist/inference/tts.d.cts +55 -16
  181. package/dist/inference/tts.d.ts +55 -16
  182. package/dist/inference/tts.d.ts.map +1 -1
  183. package/dist/inference/tts.js +249 -77
  184. package/dist/inference/tts.js.map +1 -1
  185. package/dist/inference/tts.test.cjs +233 -0
  186. package/dist/inference/tts.test.cjs.map +1 -0
  187. package/dist/inference/tts.test.js +232 -0
  188. package/dist/inference/tts.test.js.map +1 -0
  189. package/dist/inference/utils.cjs +26 -7
  190. package/dist/inference/utils.cjs.map +1 -1
  191. package/dist/inference/utils.d.cts +14 -1
  192. package/dist/inference/utils.d.ts +14 -1
  193. package/dist/inference/utils.d.ts.map +1 -1
  194. package/dist/inference/utils.js +18 -2
  195. package/dist/inference/utils.js.map +1 -1
  196. package/dist/ipc/inference_proc_executor.cjs +6 -3
  197. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  198. package/dist/ipc/inference_proc_executor.d.ts.map +1 -1
  199. package/dist/ipc/inference_proc_executor.js +6 -3
  200. package/dist/ipc/inference_proc_executor.js.map +1 -1
  201. package/dist/ipc/inference_proc_lazy_main.cjs +13 -1
  202. package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -1
  203. package/dist/ipc/inference_proc_lazy_main.js +13 -1
  204. package/dist/ipc/inference_proc_lazy_main.js.map +1 -1
  205. package/dist/ipc/job_proc_executor.cjs +6 -1
  206. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  207. package/dist/ipc/job_proc_executor.d.ts.map +1 -1
  208. package/dist/ipc/job_proc_executor.js +6 -1
  209. package/dist/ipc/job_proc_executor.js.map +1 -1
  210. package/dist/ipc/job_proc_lazy_main.cjs +89 -17
  211. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  212. package/dist/ipc/job_proc_lazy_main.js +68 -18
  213. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  214. package/dist/ipc/supervised_proc.cjs +34 -8
  215. package/dist/ipc/supervised_proc.cjs.map +1 -1
  216. package/dist/ipc/supervised_proc.d.cts +8 -0
  217. package/dist/ipc/supervised_proc.d.ts +8 -0
  218. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  219. package/dist/ipc/supervised_proc.js +34 -8
  220. package/dist/ipc/supervised_proc.js.map +1 -1
  221. package/dist/ipc/supervised_proc.test.cjs +145 -0
  222. package/dist/ipc/supervised_proc.test.cjs.map +1 -0
  223. package/dist/ipc/supervised_proc.test.js +122 -0
  224. package/dist/ipc/supervised_proc.test.js.map +1 -0
  225. package/dist/job.cjs +109 -1
  226. package/dist/job.cjs.map +1 -1
  227. package/dist/job.d.cts +14 -0
  228. package/dist/job.d.ts +14 -0
  229. package/dist/job.d.ts.map +1 -1
  230. package/dist/job.js +99 -1
  231. package/dist/job.js.map +1 -1
  232. package/dist/language.cjs +394 -0
  233. package/dist/language.cjs.map +1 -0
  234. package/dist/language.d.cts +15 -0
  235. package/dist/language.d.ts +15 -0
  236. package/dist/language.d.ts.map +1 -0
  237. package/dist/language.js +363 -0
  238. package/dist/language.js.map +1 -0
  239. package/dist/language.test.cjs +43 -0
  240. package/dist/language.test.cjs.map +1 -0
  241. package/dist/language.test.js +49 -0
  242. package/dist/language.test.js.map +1 -0
  243. package/dist/llm/chat_context.cjs +274 -3
  244. package/dist/llm/chat_context.cjs.map +1 -1
  245. package/dist/llm/chat_context.d.cts +86 -2
  246. package/dist/llm/chat_context.d.ts +86 -2
  247. package/dist/llm/chat_context.d.ts.map +1 -1
  248. package/dist/llm/chat_context.js +273 -3
  249. package/dist/llm/chat_context.js.map +1 -1
  250. package/dist/llm/chat_context.test.cjs +574 -0
  251. package/dist/llm/chat_context.test.cjs.map +1 -1
  252. package/dist/llm/chat_context.test.js +574 -0
  253. package/dist/llm/chat_context.test.js.map +1 -1
  254. package/dist/llm/fallback_adapter.cjs +278 -0
  255. package/dist/llm/fallback_adapter.cjs.map +1 -0
  256. package/dist/llm/fallback_adapter.d.cts +73 -0
  257. package/dist/llm/fallback_adapter.d.ts +73 -0
  258. package/dist/llm/fallback_adapter.d.ts.map +1 -0
  259. package/dist/llm/fallback_adapter.js +254 -0
  260. package/dist/llm/fallback_adapter.js.map +1 -0
  261. package/dist/llm/fallback_adapter.test.cjs +176 -0
  262. package/dist/llm/fallback_adapter.test.cjs.map +1 -0
  263. package/dist/llm/fallback_adapter.test.js +175 -0
  264. package/dist/llm/fallback_adapter.test.js.map +1 -0
  265. package/dist/llm/index.cjs +9 -0
  266. package/dist/llm/index.cjs.map +1 -1
  267. package/dist/llm/index.d.cts +4 -3
  268. package/dist/llm/index.d.ts +4 -3
  269. package/dist/llm/index.d.ts.map +1 -1
  270. package/dist/llm/index.js +11 -1
  271. package/dist/llm/index.js.map +1 -1
  272. package/dist/llm/llm.cjs +65 -11
  273. package/dist/llm/llm.cjs.map +1 -1
  274. package/dist/llm/llm.d.cts +13 -2
  275. package/dist/llm/llm.d.ts +13 -2
  276. package/dist/llm/llm.d.ts.map +1 -1
  277. package/dist/llm/llm.js +65 -11
  278. package/dist/llm/llm.js.map +1 -1
  279. package/dist/llm/provider_format/google.cjs +6 -2
  280. package/dist/llm/provider_format/google.cjs.map +1 -1
  281. package/dist/llm/provider_format/google.d.cts +1 -1
  282. package/dist/llm/provider_format/google.d.ts +1 -1
  283. package/dist/llm/provider_format/google.d.ts.map +1 -1
  284. package/dist/llm/provider_format/google.js +6 -2
  285. package/dist/llm/provider_format/google.js.map +1 -1
  286. package/dist/llm/provider_format/google.test.cjs +48 -0
  287. package/dist/llm/provider_format/google.test.cjs.map +1 -1
  288. package/dist/llm/provider_format/google.test.js +54 -1
  289. package/dist/llm/provider_format/google.test.js.map +1 -1
  290. package/dist/llm/provider_format/index.cjs +2 -0
  291. package/dist/llm/provider_format/index.cjs.map +1 -1
  292. package/dist/llm/provider_format/index.d.cts +2 -2
  293. package/dist/llm/provider_format/index.d.ts +2 -2
  294. package/dist/llm/provider_format/index.d.ts.map +1 -1
  295. package/dist/llm/provider_format/index.js +6 -1
  296. package/dist/llm/provider_format/index.js.map +1 -1
  297. package/dist/llm/provider_format/openai.cjs +126 -24
  298. package/dist/llm/provider_format/openai.cjs.map +1 -1
  299. package/dist/llm/provider_format/openai.d.cts +1 -0
  300. package/dist/llm/provider_format/openai.d.ts +1 -0
  301. package/dist/llm/provider_format/openai.d.ts.map +1 -1
  302. package/dist/llm/provider_format/openai.js +124 -23
  303. package/dist/llm/provider_format/openai.js.map +1 -1
  304. package/dist/llm/provider_format/openai.test.cjs +393 -0
  305. package/dist/llm/provider_format/openai.test.cjs.map +1 -1
  306. package/dist/llm/provider_format/openai.test.js +400 -2
  307. package/dist/llm/provider_format/openai.test.js.map +1 -1
  308. package/dist/llm/provider_format/utils.cjs +5 -4
  309. package/dist/llm/provider_format/utils.cjs.map +1 -1
  310. package/dist/llm/provider_format/utils.d.ts.map +1 -1
  311. package/dist/llm/provider_format/utils.js +5 -4
  312. package/dist/llm/provider_format/utils.js.map +1 -1
  313. package/dist/llm/realtime.cjs +3 -0
  314. package/dist/llm/realtime.cjs.map +1 -1
  315. package/dist/llm/realtime.d.cts +15 -1
  316. package/dist/llm/realtime.d.ts +15 -1
  317. package/dist/llm/realtime.d.ts.map +1 -1
  318. package/dist/llm/realtime.js +3 -0
  319. package/dist/llm/realtime.js.map +1 -1
  320. package/dist/llm/remote_chat_context.cjs.map +1 -1
  321. package/dist/llm/remote_chat_context.d.cts +2 -0
  322. package/dist/llm/remote_chat_context.d.ts +2 -0
  323. package/dist/llm/remote_chat_context.d.ts.map +1 -1
  324. package/dist/llm/remote_chat_context.js.map +1 -1
  325. package/dist/llm/tool_context.cjs +50 -2
  326. package/dist/llm/tool_context.cjs.map +1 -1
  327. package/dist/llm/tool_context.d.cts +47 -11
  328. package/dist/llm/tool_context.d.ts +47 -11
  329. package/dist/llm/tool_context.d.ts.map +1 -1
  330. package/dist/llm/tool_context.js +48 -3
  331. package/dist/llm/tool_context.js.map +1 -1
  332. package/dist/llm/tool_context.test.cjs +197 -0
  333. package/dist/llm/tool_context.test.cjs.map +1 -1
  334. package/dist/llm/tool_context.test.js +175 -0
  335. package/dist/llm/tool_context.test.js.map +1 -1
  336. package/dist/llm/utils.cjs +18 -12
  337. package/dist/llm/utils.cjs.map +1 -1
  338. package/dist/llm/utils.d.cts +2 -3
  339. package/dist/llm/utils.d.ts +2 -3
  340. package/dist/llm/utils.d.ts.map +1 -1
  341. package/dist/llm/utils.js +18 -12
  342. package/dist/llm/utils.js.map +1 -1
  343. package/dist/llm/zod-utils.cjs +102 -0
  344. package/dist/llm/zod-utils.cjs.map +1 -0
  345. package/dist/llm/zod-utils.d.cts +65 -0
  346. package/dist/llm/zod-utils.d.ts +65 -0
  347. package/dist/llm/zod-utils.d.ts.map +1 -0
  348. package/dist/llm/zod-utils.js +64 -0
  349. package/dist/llm/zod-utils.js.map +1 -0
  350. package/dist/llm/zod-utils.test.cjs +472 -0
  351. package/dist/llm/zod-utils.test.cjs.map +1 -0
  352. package/dist/llm/zod-utils.test.js +455 -0
  353. package/dist/llm/zod-utils.test.js.map +1 -0
  354. package/dist/log.cjs +45 -14
  355. package/dist/log.cjs.map +1 -1
  356. package/dist/log.d.cts +8 -1
  357. package/dist/log.d.ts +8 -1
  358. package/dist/log.d.ts.map +1 -1
  359. package/dist/log.js +45 -15
  360. package/dist/log.js.map +1 -1
  361. package/dist/metrics/base.cjs.map +1 -1
  362. package/dist/metrics/base.d.cts +75 -19
  363. package/dist/metrics/base.d.ts +75 -19
  364. package/dist/metrics/base.d.ts.map +1 -1
  365. package/dist/metrics/index.cjs +5 -0
  366. package/dist/metrics/index.cjs.map +1 -1
  367. package/dist/metrics/index.d.cts +2 -1
  368. package/dist/metrics/index.d.ts +2 -1
  369. package/dist/metrics/index.d.ts.map +1 -1
  370. package/dist/metrics/index.js +6 -0
  371. package/dist/metrics/index.js.map +1 -1
  372. package/dist/metrics/model_usage.cjs +189 -0
  373. package/dist/metrics/model_usage.cjs.map +1 -0
  374. package/dist/metrics/model_usage.d.cts +92 -0
  375. package/dist/metrics/model_usage.d.ts +92 -0
  376. package/dist/metrics/model_usage.d.ts.map +1 -0
  377. package/dist/metrics/model_usage.js +164 -0
  378. package/dist/metrics/model_usage.js.map +1 -0
  379. package/dist/metrics/model_usage.test.cjs +474 -0
  380. package/dist/metrics/model_usage.test.cjs.map +1 -0
  381. package/dist/metrics/model_usage.test.js +476 -0
  382. package/dist/metrics/model_usage.test.js.map +1 -0
  383. package/dist/metrics/usage_collector.cjs +5 -2
  384. package/dist/metrics/usage_collector.cjs.map +1 -1
  385. package/dist/metrics/usage_collector.d.cts +10 -1
  386. package/dist/metrics/usage_collector.d.ts +10 -1
  387. package/dist/metrics/usage_collector.d.ts.map +1 -1
  388. package/dist/metrics/usage_collector.js +5 -2
  389. package/dist/metrics/usage_collector.js.map +1 -1
  390. package/dist/metrics/utils.cjs +23 -7
  391. package/dist/metrics/utils.cjs.map +1 -1
  392. package/dist/metrics/utils.d.ts.map +1 -1
  393. package/dist/metrics/utils.js +23 -7
  394. package/dist/metrics/utils.js.map +1 -1
  395. package/dist/stream/deferred_stream.cjs +31 -10
  396. package/dist/stream/deferred_stream.cjs.map +1 -1
  397. package/dist/stream/deferred_stream.d.cts +6 -1
  398. package/dist/stream/deferred_stream.d.ts +6 -1
  399. package/dist/stream/deferred_stream.d.ts.map +1 -1
  400. package/dist/stream/deferred_stream.js +31 -10
  401. package/dist/stream/deferred_stream.js.map +1 -1
  402. package/dist/stream/deferred_stream.test.cjs +2 -2
  403. package/dist/stream/deferred_stream.test.cjs.map +1 -1
  404. package/dist/stream/deferred_stream.test.js +2 -2
  405. package/dist/stream/deferred_stream.test.js.map +1 -1
  406. package/dist/stream/index.cjs +3 -0
  407. package/dist/stream/index.cjs.map +1 -1
  408. package/dist/stream/index.d.cts +1 -0
  409. package/dist/stream/index.d.ts +1 -0
  410. package/dist/stream/index.d.ts.map +1 -1
  411. package/dist/stream/index.js +2 -0
  412. package/dist/stream/index.js.map +1 -1
  413. package/dist/stream/multi_input_stream.cjs +139 -0
  414. package/dist/stream/multi_input_stream.cjs.map +1 -0
  415. package/dist/stream/multi_input_stream.d.cts +55 -0
  416. package/dist/stream/multi_input_stream.d.ts +55 -0
  417. package/dist/stream/multi_input_stream.d.ts.map +1 -0
  418. package/dist/stream/multi_input_stream.js +115 -0
  419. package/dist/stream/multi_input_stream.js.map +1 -0
  420. package/dist/stream/multi_input_stream.test.cjs +344 -0
  421. package/dist/stream/multi_input_stream.test.cjs.map +1 -0
  422. package/dist/stream/multi_input_stream.test.js +343 -0
  423. package/dist/stream/multi_input_stream.test.js.map +1 -0
  424. package/dist/stream/stream_channel.cjs +39 -1
  425. package/dist/stream/stream_channel.cjs.map +1 -1
  426. package/dist/stream/stream_channel.d.cts +5 -2
  427. package/dist/stream/stream_channel.d.ts +5 -2
  428. package/dist/stream/stream_channel.d.ts.map +1 -1
  429. package/dist/stream/stream_channel.js +39 -1
  430. package/dist/stream/stream_channel.js.map +1 -1
  431. package/dist/stream/stream_channel.test.cjs +27 -0
  432. package/dist/stream/stream_channel.test.cjs.map +1 -1
  433. package/dist/stream/stream_channel.test.js +27 -0
  434. package/dist/stream/stream_channel.test.js.map +1 -1
  435. package/dist/stt/stream_adapter.cjs +24 -9
  436. package/dist/stt/stream_adapter.cjs.map +1 -1
  437. package/dist/stt/stream_adapter.d.cts +7 -3
  438. package/dist/stt/stream_adapter.d.ts +7 -3
  439. package/dist/stt/stream_adapter.d.ts.map +1 -1
  440. package/dist/stt/stream_adapter.js +24 -9
  441. package/dist/stt/stream_adapter.js.map +1 -1
  442. package/dist/stt/stt.cjs +86 -19
  443. package/dist/stt/stt.cjs.map +1 -1
  444. package/dist/stt/stt.d.cts +60 -5
  445. package/dist/stt/stt.d.ts +60 -5
  446. package/dist/stt/stt.d.ts.map +1 -1
  447. package/dist/stt/stt.js +88 -21
  448. package/dist/stt/stt.js.map +1 -1
  449. package/dist/telemetry/index.cjs +72 -0
  450. package/dist/telemetry/index.cjs.map +1 -0
  451. package/dist/telemetry/index.d.cts +7 -0
  452. package/dist/telemetry/index.d.ts +7 -0
  453. package/dist/telemetry/index.d.ts.map +1 -0
  454. package/dist/telemetry/index.js +37 -0
  455. package/dist/telemetry/index.js.map +1 -0
  456. package/dist/telemetry/logging.cjs +65 -0
  457. package/dist/telemetry/logging.cjs.map +1 -0
  458. package/dist/telemetry/logging.d.cts +21 -0
  459. package/dist/telemetry/logging.d.ts +21 -0
  460. package/dist/telemetry/logging.d.ts.map +1 -0
  461. package/dist/telemetry/logging.js +40 -0
  462. package/dist/telemetry/logging.js.map +1 -0
  463. package/dist/telemetry/otel_http_exporter.cjs +166 -0
  464. package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
  465. package/dist/telemetry/otel_http_exporter.d.cts +63 -0
  466. package/dist/telemetry/otel_http_exporter.d.ts +63 -0
  467. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
  468. package/dist/telemetry/otel_http_exporter.js +142 -0
  469. package/dist/telemetry/otel_http_exporter.js.map +1 -0
  470. package/dist/telemetry/pino_otel_transport.cjs +217 -0
  471. package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
  472. package/dist/telemetry/pino_otel_transport.d.cts +58 -0
  473. package/dist/telemetry/pino_otel_transport.d.ts +58 -0
  474. package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
  475. package/dist/telemetry/pino_otel_transport.js +189 -0
  476. package/dist/telemetry/pino_otel_transport.js.map +1 -0
  477. package/dist/telemetry/trace_types.cjs +233 -0
  478. package/dist/telemetry/trace_types.cjs.map +1 -0
  479. package/dist/telemetry/trace_types.d.cts +74 -0
  480. package/dist/telemetry/trace_types.d.ts +74 -0
  481. package/dist/telemetry/trace_types.d.ts.map +1 -0
  482. package/dist/telemetry/trace_types.js +141 -0
  483. package/dist/telemetry/trace_types.js.map +1 -0
  484. package/dist/telemetry/traces.cjs +484 -0
  485. package/dist/telemetry/traces.cjs.map +1 -0
  486. package/dist/telemetry/traces.d.cts +116 -0
  487. package/dist/telemetry/traces.d.ts +116 -0
  488. package/dist/telemetry/traces.d.ts.map +1 -0
  489. package/dist/telemetry/traces.js +449 -0
  490. package/dist/telemetry/traces.js.map +1 -0
  491. package/dist/telemetry/utils.cjs +86 -0
  492. package/dist/telemetry/utils.cjs.map +1 -0
  493. package/dist/telemetry/utils.d.cts +5 -0
  494. package/dist/telemetry/utils.d.ts +5 -0
  495. package/dist/telemetry/utils.d.ts.map +1 -0
  496. package/dist/telemetry/utils.js +51 -0
  497. package/dist/telemetry/utils.js.map +1 -0
  498. package/dist/tokenize/basic/sentence.cjs +3 -3
  499. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  500. package/dist/tokenize/basic/sentence.js +3 -3
  501. package/dist/tokenize/basic/sentence.js.map +1 -1
  502. package/dist/tokenize/tokenizer.test.cjs +3 -1
  503. package/dist/tokenize/tokenizer.test.cjs.map +1 -1
  504. package/dist/tokenize/tokenizer.test.js +3 -1
  505. package/dist/tokenize/tokenizer.test.js.map +1 -1
  506. package/dist/transcription.cjs.map +1 -1
  507. package/dist/transcription.d.cts +6 -0
  508. package/dist/transcription.d.ts +6 -0
  509. package/dist/transcription.d.ts.map +1 -1
  510. package/dist/transcription.js.map +1 -1
  511. package/dist/tts/fallback_adapter.cjs +466 -0
  512. package/dist/tts/fallback_adapter.cjs.map +1 -0
  513. package/dist/tts/fallback_adapter.d.cts +110 -0
  514. package/dist/tts/fallback_adapter.d.ts +110 -0
  515. package/dist/tts/fallback_adapter.d.ts.map +1 -0
  516. package/dist/tts/fallback_adapter.js +442 -0
  517. package/dist/tts/fallback_adapter.js.map +1 -0
  518. package/dist/tts/index.cjs +3 -0
  519. package/dist/tts/index.cjs.map +1 -1
  520. package/dist/tts/index.d.cts +1 -0
  521. package/dist/tts/index.d.ts +1 -0
  522. package/dist/tts/index.d.ts.map +1 -1
  523. package/dist/tts/index.js +2 -0
  524. package/dist/tts/index.js.map +1 -1
  525. package/dist/tts/stream_adapter.cjs +25 -8
  526. package/dist/tts/stream_adapter.cjs.map +1 -1
  527. package/dist/tts/stream_adapter.d.cts +6 -3
  528. package/dist/tts/stream_adapter.d.ts +6 -3
  529. package/dist/tts/stream_adapter.d.ts.map +1 -1
  530. package/dist/tts/stream_adapter.js +25 -8
  531. package/dist/tts/stream_adapter.js.map +1 -1
  532. package/dist/tts/tts.cjs +189 -57
  533. package/dist/tts/tts.cjs.map +1 -1
  534. package/dist/tts/tts.d.cts +58 -6
  535. package/dist/tts/tts.d.ts +58 -6
  536. package/dist/tts/tts.d.ts.map +1 -1
  537. package/dist/tts/tts.js +191 -59
  538. package/dist/tts/tts.js.map +1 -1
  539. package/dist/types.cjs +24 -32
  540. package/dist/types.cjs.map +1 -1
  541. package/dist/types.d.cts +45 -10
  542. package/dist/types.d.ts +45 -10
  543. package/dist/types.d.ts.map +1 -1
  544. package/dist/types.js +20 -30
  545. package/dist/types.js.map +1 -1
  546. package/dist/utils.cjs +122 -26
  547. package/dist/utils.cjs.map +1 -1
  548. package/dist/utils.d.cts +41 -1
  549. package/dist/utils.d.ts +41 -1
  550. package/dist/utils.d.ts.map +1 -1
  551. package/dist/utils.js +117 -25
  552. package/dist/utils.js.map +1 -1
  553. package/dist/utils.test.cjs +73 -1
  554. package/dist/utils.test.cjs.map +1 -1
  555. package/dist/utils.test.js +74 -10
  556. package/dist/utils.test.js.map +1 -1
  557. package/dist/vad.cjs +35 -15
  558. package/dist/vad.cjs.map +1 -1
  559. package/dist/vad.d.cts +15 -5
  560. package/dist/vad.d.ts +15 -5
  561. package/dist/vad.d.ts.map +1 -1
  562. package/dist/vad.js +35 -15
  563. package/dist/vad.js.map +1 -1
  564. package/dist/version.cjs +1 -1
  565. package/dist/version.cjs.map +1 -1
  566. package/dist/version.d.cts +1 -1
  567. package/dist/version.d.ts +1 -1
  568. package/dist/version.d.ts.map +1 -1
  569. package/dist/version.js +1 -1
  570. package/dist/version.js.map +1 -1
  571. package/dist/voice/agent.cjs +258 -35
  572. package/dist/voice/agent.cjs.map +1 -1
  573. package/dist/voice/agent.d.cts +54 -13
  574. package/dist/voice/agent.d.ts +54 -13
  575. package/dist/voice/agent.d.ts.map +1 -1
  576. package/dist/voice/agent.js +254 -34
  577. package/dist/voice/agent.js.map +1 -1
  578. package/dist/voice/agent.test.cjs +314 -0
  579. package/dist/voice/agent.test.cjs.map +1 -1
  580. package/dist/voice/agent.test.js +316 -2
  581. package/dist/voice/agent.test.js.map +1 -1
  582. package/dist/voice/agent_activity.cjs +1116 -385
  583. package/dist/voice/agent_activity.cjs.map +1 -1
  584. package/dist/voice/agent_activity.d.cts +72 -11
  585. package/dist/voice/agent_activity.d.ts +72 -11
  586. package/dist/voice/agent_activity.d.ts.map +1 -1
  587. package/dist/voice/agent_activity.js +1119 -383
  588. package/dist/voice/agent_activity.js.map +1 -1
  589. package/dist/voice/agent_activity.test.cjs +135 -0
  590. package/dist/voice/agent_activity.test.cjs.map +1 -0
  591. package/dist/voice/agent_activity.test.js +134 -0
  592. package/dist/voice/agent_activity.test.js.map +1 -0
  593. package/dist/voice/agent_session.cjs +550 -90
  594. package/dist/voice/agent_session.cjs.map +1 -1
  595. package/dist/voice/agent_session.d.cts +185 -25
  596. package/dist/voice/agent_session.d.ts +185 -25
  597. package/dist/voice/agent_session.d.ts.map +1 -1
  598. package/dist/voice/agent_session.js +556 -91
  599. package/dist/voice/agent_session.js.map +1 -1
  600. package/dist/voice/audio_recognition.cjs +605 -46
  601. package/dist/voice/audio_recognition.cjs.map +1 -1
  602. package/dist/voice/audio_recognition.d.cts +96 -4
  603. package/dist/voice/audio_recognition.d.ts +96 -4
  604. package/dist/voice/audio_recognition.d.ts.map +1 -1
  605. package/dist/voice/audio_recognition.js +611 -47
  606. package/dist/voice/audio_recognition.js.map +1 -1
  607. package/dist/voice/audio_recognition_span.test.cjs +295 -0
  608. package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
  609. package/dist/voice/audio_recognition_span.test.js +299 -0
  610. package/dist/voice/audio_recognition_span.test.js.map +1 -0
  611. package/dist/voice/avatar/datastream_io.cjs +7 -1
  612. package/dist/voice/avatar/datastream_io.cjs.map +1 -1
  613. package/dist/voice/avatar/datastream_io.d.cts +1 -0
  614. package/dist/voice/avatar/datastream_io.d.ts +1 -0
  615. package/dist/voice/avatar/datastream_io.d.ts.map +1 -1
  616. package/dist/voice/avatar/datastream_io.js +7 -1
  617. package/dist/voice/avatar/datastream_io.js.map +1 -1
  618. package/dist/voice/background_audio.cjs +367 -0
  619. package/dist/voice/background_audio.cjs.map +1 -0
  620. package/dist/voice/background_audio.d.cts +123 -0
  621. package/dist/voice/background_audio.d.ts +123 -0
  622. package/dist/voice/background_audio.d.ts.map +1 -0
  623. package/dist/voice/background_audio.js +343 -0
  624. package/dist/voice/background_audio.js.map +1 -0
  625. package/dist/voice/events.cjs +3 -0
  626. package/dist/voice/events.cjs.map +1 -1
  627. package/dist/voice/events.d.cts +16 -9
  628. package/dist/voice/events.d.ts +16 -9
  629. package/dist/voice/events.d.ts.map +1 -1
  630. package/dist/voice/events.js +3 -0
  631. package/dist/voice/events.js.map +1 -1
  632. package/dist/voice/generation.cjs +205 -41
  633. package/dist/voice/generation.cjs.map +1 -1
  634. package/dist/voice/generation.d.cts +21 -5
  635. package/dist/voice/generation.d.ts +21 -5
  636. package/dist/voice/generation.d.ts.map +1 -1
  637. package/dist/voice/generation.js +215 -43
  638. package/dist/voice/generation.js.map +1 -1
  639. package/dist/voice/generation_tools.test.cjs +236 -0
  640. package/dist/voice/generation_tools.test.cjs.map +1 -0
  641. package/dist/voice/generation_tools.test.js +235 -0
  642. package/dist/voice/generation_tools.test.js.map +1 -0
  643. package/dist/voice/index.cjs +33 -2
  644. package/dist/voice/index.cjs.map +1 -1
  645. package/dist/voice/index.d.cts +8 -2
  646. package/dist/voice/index.d.ts +8 -2
  647. package/dist/voice/index.d.ts.map +1 -1
  648. package/dist/voice/index.js +19 -2
  649. package/dist/voice/index.js.map +1 -1
  650. package/dist/voice/interruption_detection.test.cjs +114 -0
  651. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  652. package/dist/voice/interruption_detection.test.js +113 -0
  653. package/dist/voice/interruption_detection.test.js.map +1 -0
  654. package/dist/voice/io.cjs +66 -6
  655. package/dist/voice/io.cjs.map +1 -1
  656. package/dist/voice/io.d.cts +67 -7
  657. package/dist/voice/io.d.ts +67 -7
  658. package/dist/voice/io.d.ts.map +1 -1
  659. package/dist/voice/io.js +62 -5
  660. package/dist/voice/io.js.map +1 -1
  661. package/dist/voice/recorder_io/index.cjs +23 -0
  662. package/dist/voice/recorder_io/index.cjs.map +1 -0
  663. package/dist/voice/recorder_io/index.d.cts +2 -0
  664. package/dist/voice/recorder_io/index.d.ts +2 -0
  665. package/dist/voice/recorder_io/index.d.ts.map +1 -0
  666. package/dist/voice/recorder_io/index.js +2 -0
  667. package/dist/voice/recorder_io/index.js.map +1 -0
  668. package/dist/voice/recorder_io/recorder_io.cjs +607 -0
  669. package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
  670. package/dist/voice/recorder_io/recorder_io.d.cts +106 -0
  671. package/dist/voice/recorder_io/recorder_io.d.ts +106 -0
  672. package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
  673. package/dist/voice/recorder_io/recorder_io.js +573 -0
  674. package/dist/voice/recorder_io/recorder_io.js.map +1 -0
  675. package/dist/voice/remote_session.cjs +922 -0
  676. package/dist/voice/remote_session.cjs.map +1 -0
  677. package/dist/voice/remote_session.d.cts +108 -0
  678. package/dist/voice/remote_session.d.ts +108 -0
  679. package/dist/voice/remote_session.d.ts.map +1 -0
  680. package/dist/voice/remote_session.js +887 -0
  681. package/dist/voice/remote_session.js.map +1 -0
  682. package/dist/voice/report.cjs +88 -0
  683. package/dist/voice/report.cjs.map +1 -0
  684. package/dist/voice/report.d.cts +49 -0
  685. package/dist/voice/report.d.ts +49 -0
  686. package/dist/voice/report.d.ts.map +1 -0
  687. package/dist/voice/report.js +63 -0
  688. package/dist/voice/report.js.map +1 -0
  689. package/dist/voice/report.test.cjs +121 -0
  690. package/dist/voice/report.test.cjs.map +1 -0
  691. package/dist/voice/report.test.js +120 -0
  692. package/dist/voice/report.test.js.map +1 -0
  693. package/dist/voice/room_io/_input.cjs +40 -7
  694. package/dist/voice/room_io/_input.cjs.map +1 -1
  695. package/dist/voice/room_io/_input.d.cts +5 -2
  696. package/dist/voice/room_io/_input.d.ts +5 -2
  697. package/dist/voice/room_io/_input.d.ts.map +1 -1
  698. package/dist/voice/room_io/_input.js +41 -8
  699. package/dist/voice/room_io/_input.js.map +1 -1
  700. package/dist/voice/room_io/_output.cjs +19 -11
  701. package/dist/voice/room_io/_output.cjs.map +1 -1
  702. package/dist/voice/room_io/_output.d.cts +7 -4
  703. package/dist/voice/room_io/_output.d.ts +7 -4
  704. package/dist/voice/room_io/_output.d.ts.map +1 -1
  705. package/dist/voice/room_io/_output.js +20 -12
  706. package/dist/voice/room_io/_output.js.map +1 -1
  707. package/dist/voice/room_io/room_io.cjs +33 -6
  708. package/dist/voice/room_io/room_io.cjs.map +1 -1
  709. package/dist/voice/room_io/room_io.d.cts +29 -9
  710. package/dist/voice/room_io/room_io.d.ts +29 -9
  711. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  712. package/dist/voice/room_io/room_io.js +33 -7
  713. package/dist/voice/room_io/room_io.js.map +1 -1
  714. package/dist/voice/speech_handle.cjs +22 -4
  715. package/dist/voice/speech_handle.cjs.map +1 -1
  716. package/dist/voice/speech_handle.d.cts +17 -2
  717. package/dist/voice/speech_handle.d.ts +17 -2
  718. package/dist/voice/speech_handle.d.ts.map +1 -1
  719. package/dist/voice/speech_handle.js +21 -4
  720. package/dist/voice/speech_handle.js.map +1 -1
  721. package/dist/voice/testing/fake_llm.cjs +127 -0
  722. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  723. package/dist/voice/testing/fake_llm.d.cts +30 -0
  724. package/dist/voice/testing/fake_llm.d.ts +30 -0
  725. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  726. package/dist/voice/testing/fake_llm.js +103 -0
  727. package/dist/voice/testing/fake_llm.js.map +1 -0
  728. package/dist/voice/testing/index.cjs +57 -0
  729. package/dist/voice/testing/index.cjs.map +1 -0
  730. package/dist/voice/testing/index.d.cts +21 -0
  731. package/dist/voice/testing/index.d.ts +21 -0
  732. package/dist/voice/testing/index.d.ts.map +1 -0
  733. package/dist/voice/testing/index.js +35 -0
  734. package/dist/voice/testing/index.js.map +1 -0
  735. package/dist/voice/testing/run_result.cjs +817 -0
  736. package/dist/voice/testing/run_result.cjs.map +1 -0
  737. package/dist/voice/testing/run_result.d.cts +385 -0
  738. package/dist/voice/testing/run_result.d.ts +385 -0
  739. package/dist/voice/testing/run_result.d.ts.map +1 -0
  740. package/dist/voice/testing/run_result.js +790 -0
  741. package/dist/voice/testing/run_result.js.map +1 -0
  742. package/dist/voice/testing/types.cjs +46 -0
  743. package/dist/voice/testing/types.cjs.map +1 -0
  744. package/dist/voice/testing/types.d.cts +83 -0
  745. package/dist/voice/testing/types.d.ts +83 -0
  746. package/dist/voice/testing/types.d.ts.map +1 -0
  747. package/dist/voice/testing/types.js +19 -0
  748. package/dist/voice/testing/types.js.map +1 -0
  749. package/dist/voice/transcription/synchronizer.cjs +139 -15
  750. package/dist/voice/transcription/synchronizer.cjs.map +1 -1
  751. package/dist/voice/transcription/synchronizer.d.cts +35 -4
  752. package/dist/voice/transcription/synchronizer.d.ts +35 -4
  753. package/dist/voice/transcription/synchronizer.d.ts.map +1 -1
  754. package/dist/voice/transcription/synchronizer.js +143 -16
  755. package/dist/voice/transcription/synchronizer.js.map +1 -1
  756. package/dist/voice/transcription/synchronizer.test.cjs +151 -0
  757. package/dist/voice/transcription/synchronizer.test.cjs.map +1 -0
  758. package/dist/voice/transcription/synchronizer.test.js +150 -0
  759. package/dist/voice/transcription/synchronizer.test.js.map +1 -0
  760. package/dist/voice/turn_config/endpointing.cjs +33 -0
  761. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  762. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  763. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  764. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  765. package/dist/voice/turn_config/endpointing.js +9 -0
  766. package/dist/voice/turn_config/endpointing.js.map +1 -0
  767. package/dist/voice/turn_config/interruption.cjs +37 -0
  768. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  769. package/dist/voice/turn_config/interruption.d.cts +53 -0
  770. package/dist/voice/turn_config/interruption.d.ts +53 -0
  771. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  772. package/dist/voice/turn_config/interruption.js +13 -0
  773. package/dist/voice/turn_config/interruption.js.map +1 -0
  774. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  775. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  776. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  777. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  778. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  779. package/dist/voice/turn_config/turn_handling.js +11 -0
  780. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  781. package/dist/voice/turn_config/utils.cjs +157 -0
  782. package/dist/voice/turn_config/utils.cjs.map +1 -0
  783. package/dist/voice/turn_config/utils.d.cts +37 -0
  784. package/dist/voice/turn_config/utils.d.ts +37 -0
  785. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  786. package/dist/voice/turn_config/utils.js +131 -0
  787. package/dist/voice/turn_config/utils.js.map +1 -0
  788. package/dist/voice/turn_config/utils.test.cjs +128 -0
  789. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  790. package/dist/voice/turn_config/utils.test.js +127 -0
  791. package/dist/voice/turn_config/utils.test.js.map +1 -0
  792. package/dist/voice/utils.cjs +47 -0
  793. package/dist/voice/utils.cjs.map +1 -0
  794. package/dist/voice/utils.d.cts +4 -0
  795. package/dist/voice/utils.d.ts +4 -0
  796. package/dist/voice/utils.d.ts.map +1 -0
  797. package/dist/voice/utils.js +23 -0
  798. package/dist/voice/utils.js.map +1 -0
  799. package/dist/worker.cjs +44 -52
  800. package/dist/worker.cjs.map +1 -1
  801. package/dist/worker.d.cts +18 -8
  802. package/dist/worker.d.ts +18 -8
  803. package/dist/worker.d.ts.map +1 -1
  804. package/dist/worker.js +43 -43
  805. package/dist/worker.js.map +1 -1
  806. package/package.json +32 -12
  807. package/resources/NOTICE +2 -0
  808. package/resources/keyboard-typing.ogg +0 -0
  809. package/resources/keyboard-typing2.ogg +0 -0
  810. package/resources/office-ambience.ogg +0 -0
  811. package/src/audio.ts +132 -1
  812. package/src/beta/index.ts +9 -0
  813. package/src/beta/workflows/index.ts +9 -0
  814. package/src/beta/workflows/task_group.ts +194 -0
  815. package/src/cli.ts +57 -66
  816. package/src/connection_pool.test.ts +346 -0
  817. package/src/connection_pool.ts +307 -0
  818. package/src/constants.ts +14 -0
  819. package/src/cpu.test.ts +239 -0
  820. package/src/cpu.ts +173 -0
  821. package/src/http_server.ts +18 -6
  822. package/src/index.ts +15 -13
  823. package/src/inference/api_protos.ts +85 -2
  824. package/src/inference/index.ts +32 -4
  825. package/src/inference/interruption/defaults.ts +51 -0
  826. package/src/inference/interruption/errors.ts +25 -0
  827. package/src/inference/interruption/http_transport.ts +206 -0
  828. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  829. package/src/inference/interruption/interruption_detector.ts +204 -0
  830. package/src/inference/interruption/interruption_stream.ts +467 -0
  831. package/src/inference/interruption/types.ts +84 -0
  832. package/src/inference/interruption/utils.test.ts +132 -0
  833. package/src/inference/interruption/utils.ts +137 -0
  834. package/src/inference/interruption/ws_transport.ts +406 -0
  835. package/src/inference/llm.ts +214 -163
  836. package/src/inference/stt.test.ts +253 -0
  837. package/src/inference/stt.ts +449 -208
  838. package/src/inference/tts.test.ts +267 -0
  839. package/src/inference/tts.ts +377 -115
  840. package/src/inference/utils.ts +30 -2
  841. package/src/ipc/inference_proc_executor.ts +11 -3
  842. package/src/ipc/inference_proc_lazy_main.ts +13 -1
  843. package/src/ipc/job_proc_executor.ts +11 -1
  844. package/src/ipc/job_proc_lazy_main.ts +86 -20
  845. package/src/ipc/supervised_proc.test.ts +153 -0
  846. package/src/ipc/supervised_proc.ts +39 -10
  847. package/src/job.ts +120 -1
  848. package/src/language.test.ts +62 -0
  849. package/src/language.ts +380 -0
  850. package/src/llm/__snapshots__/zod-utils.test.ts.snap +559 -0
  851. package/src/llm/chat_context.test.ts +655 -0
  852. package/src/llm/chat_context.ts +412 -2
  853. package/src/llm/fallback_adapter.test.ts +238 -0
  854. package/src/llm/fallback_adapter.ts +391 -0
  855. package/src/llm/index.ts +11 -0
  856. package/src/llm/llm.ts +77 -12
  857. package/src/llm/provider_format/google.test.ts +72 -1
  858. package/src/llm/provider_format/google.ts +10 -6
  859. package/src/llm/provider_format/index.ts +7 -2
  860. package/src/llm/provider_format/openai.test.ts +480 -2
  861. package/src/llm/provider_format/openai.ts +152 -21
  862. package/src/llm/provider_format/utils.ts +11 -5
  863. package/src/llm/realtime.ts +23 -2
  864. package/src/llm/remote_chat_context.ts +2 -2
  865. package/src/llm/tool_context.test.ts +210 -1
  866. package/src/llm/tool_context.ts +115 -17
  867. package/src/llm/utils.ts +24 -16
  868. package/src/llm/zod-utils.test.ts +577 -0
  869. package/src/llm/zod-utils.ts +153 -0
  870. package/src/log.ts +71 -19
  871. package/src/metrics/base.ts +78 -19
  872. package/src/metrics/index.ts +12 -0
  873. package/src/metrics/model_usage.test.ts +545 -0
  874. package/src/metrics/model_usage.ts +262 -0
  875. package/src/metrics/usage_collector.ts +14 -3
  876. package/src/metrics/utils.ts +27 -7
  877. package/src/stream/deferred_stream.test.ts +3 -3
  878. package/src/stream/deferred_stream.ts +43 -11
  879. package/src/stream/index.ts +1 -0
  880. package/src/stream/multi_input_stream.test.ts +545 -0
  881. package/src/stream/multi_input_stream.ts +172 -0
  882. package/src/stream/stream_channel.test.ts +37 -0
  883. package/src/stream/stream_channel.ts +43 -3
  884. package/src/stt/stream_adapter.ts +30 -9
  885. package/src/stt/stt.ts +131 -22
  886. package/src/telemetry/index.ts +28 -0
  887. package/src/telemetry/logging.ts +55 -0
  888. package/src/telemetry/otel_http_exporter.ts +218 -0
  889. package/src/telemetry/pino_otel_transport.ts +265 -0
  890. package/src/telemetry/trace_types.ts +109 -0
  891. package/src/telemetry/traces.ts +673 -0
  892. package/src/telemetry/utils.ts +61 -0
  893. package/src/tokenize/basic/sentence.ts +3 -3
  894. package/src/tokenize/tokenizer.test.ts +4 -0
  895. package/src/transcription.ts +6 -0
  896. package/src/tts/fallback_adapter.ts +579 -0
  897. package/src/tts/index.ts +1 -0
  898. package/src/tts/stream_adapter.ts +38 -8
  899. package/src/tts/tts.ts +245 -62
  900. package/src/types.ts +62 -33
  901. package/src/utils.test.ts +90 -10
  902. package/src/utils.ts +176 -31
  903. package/src/vad.ts +42 -18
  904. package/src/version.ts +1 -1
  905. package/src/voice/agent.test.ts +347 -2
  906. package/src/voice/agent.ts +346 -44
  907. package/src/voice/agent_activity.test.ts +194 -0
  908. package/src/voice/agent_activity.ts +1457 -388
  909. package/src/voice/agent_session.ts +817 -112
  910. package/src/voice/audio_recognition.ts +845 -70
  911. package/src/voice/audio_recognition_span.test.ts +341 -0
  912. package/src/voice/avatar/datastream_io.ts +9 -1
  913. package/src/voice/background_audio.ts +494 -0
  914. package/src/voice/events.ts +27 -7
  915. package/src/voice/generation.ts +310 -56
  916. package/src/voice/generation_tools.test.ts +268 -0
  917. package/src/voice/index.ts +17 -3
  918. package/src/voice/interruption_detection.test.ts +151 -0
  919. package/src/voice/io.ts +115 -12
  920. package/src/voice/recorder_io/index.ts +4 -0
  921. package/src/voice/recorder_io/recorder_io.ts +783 -0
  922. package/src/voice/remote_session.ts +1083 -0
  923. package/src/voice/report.test.ts +136 -0
  924. package/src/voice/report.ts +140 -0
  925. package/src/voice/room_io/_input.ts +45 -10
  926. package/src/voice/room_io/_output.ts +26 -14
  927. package/src/voice/room_io/room_io.ts +67 -22
  928. package/src/voice/speech_handle.ts +38 -6
  929. package/src/voice/testing/fake_llm.ts +138 -0
  930. package/src/voice/testing/index.ts +52 -0
  931. package/src/voice/testing/run_result.ts +995 -0
  932. package/src/voice/testing/types.ts +118 -0
  933. package/src/voice/transcription/synchronizer.test.ts +206 -0
  934. package/src/voice/transcription/synchronizer.ts +204 -19
  935. package/src/voice/turn_config/endpointing.ts +33 -0
  936. package/src/voice/turn_config/interruption.ts +56 -0
  937. package/src/voice/turn_config/turn_handling.ts +45 -0
  938. package/src/voice/turn_config/utils.test.ts +148 -0
  939. package/src/voice/turn_config/utils.ts +167 -0
  940. package/src/voice/utils.ts +29 -0
  941. package/src/worker.ts +92 -78
  942. package/src/llm/__snapshots__/utils.test.ts.snap +0 -65
@@ -5,96 +5,169 @@ import type { AudioFrame } from '@livekit/rtc-node';
5
5
  import { WebSocket } from 'ws';
6
6
  import { APIError, APIStatusError } from '../_exceptions.js';
7
7
  import { AudioByteStream } from '../audio.js';
8
+ import { ConnectionPool } from '../connection_pool.js';
9
+ import { type LanguageCode, normalizeLanguage } from '../language.js';
8
10
  import { log } from '../log.js';
9
11
  import { createStreamChannel } from '../stream/stream_channel.js';
10
12
  import { basic as tokenizeBasic } from '../tokenize/index.js';
11
- import {
12
- SynthesizeStream as BaseSynthesizeStream,
13
- TTS as BaseTTS,
14
- ChunkedStream,
15
- } from '../tts/index.js';
13
+ import type { ChunkedStream } from '../tts/index.js';
14
+ import { SynthesizeStream as BaseSynthesizeStream, TTS as BaseTTS } from '../tts/index.js';
16
15
  import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';
17
- import { shortuuid } from '../utils.js';
16
+ import { Event, Future, Task, cancelAndWait, combineSignals, shortuuid } from '../utils.js';
18
17
  import {
19
18
  type TtsClientEvent,
20
19
  type TtsServerEvent,
21
- type TtsSessionCreateEvent,
22
20
  ttsClientEventSchema,
23
21
  ttsServerEventSchema,
24
22
  } from './api_protos.js';
25
- import { type AnyModels, connectWs, createAccessToken } from './utils.js';
23
+ import { type AnyString, connectWs, createAccessToken, getDefaultInferenceUrl } from './utils.js';
26
24
 
27
- type _CartesiaModels = 'cartesia' | 'cartesia/sonic' | 'cartesia/sonic-2' | 'cartesia/sonic-turbo';
25
+ export type CartesiaModels =
26
+ | 'cartesia/sonic-3'
27
+ | 'cartesia/sonic-2'
28
+ | 'cartesia/sonic-turbo'
29
+ | 'cartesia/sonic';
28
30
 
29
- export type CartesiaModels = _CartesiaModels | `${_CartesiaModels}:${string}`;
31
+ export type DeepgramTTSModels = 'deepgram/aura' | 'deepgram/aura-2';
30
32
 
31
- type _ElevenlabsModels =
32
- | 'elevenlabs'
33
+ export type ElevenlabsModels =
33
34
  | 'elevenlabs/eleven_flash_v2'
34
35
  | 'elevenlabs/eleven_flash_v2_5'
35
36
  | 'elevenlabs/eleven_turbo_v2'
36
37
  | 'elevenlabs/eleven_turbo_v2_5'
37
38
  | 'elevenlabs/eleven_multilingual_v2';
38
39
 
39
- export type ElevenlabsModels = _ElevenlabsModels | `${_ElevenlabsModels}:${string}`;
40
-
41
- export type _RimeModels = 'rime' | 'rime/mist' | 'rime/mistv2' | 'rime/arcana';
42
-
43
- export type RimeModels = _RimeModels | `${_RimeModels}:${string}`;
44
-
45
- export type _InworldModels = 'inworld' | 'inworld/inworld-tts-1';
40
+ export type InworldModels =
41
+ | 'inworld/inworld-tts-1.5-max'
42
+ | 'inworld/inworld-tts-1.5-mini'
43
+ | 'inworld/inworld-tts-1-max'
44
+ | 'inworld/inworld-tts-1';
46
45
 
47
- export type InworldModels = _InworldModels | `${_InworldModels}:${string}`;
46
+ export type RimeModels = 'rime/arcana' | 'rime/mistv2';
48
47
 
49
48
  export interface CartesiaOptions {
50
- duration?: number; // max duration of audio in seconds
51
- speed?: 'slow' | 'normal' | 'fast'; // default: not specified
49
+ /** Maximum duration of audio in seconds. */
50
+ duration?: number;
51
+ /** Speech speed. Default: not specified. */
52
+ speed?: 'slow' | 'normal' | 'fast';
52
53
  }
53
54
 
54
55
  export interface ElevenlabsOptions {
55
- inactivity_timeout?: number; // default: 60
56
- apply_text_normalization?: 'auto' | 'off' | 'on'; // default: "auto"
56
+ /** Inactivity timeout in seconds. Default: 60. */
57
+ inactivity_timeout?: number;
58
+ /** Text normalization mode. Default: "auto". */
59
+ apply_text_normalization?: 'auto' | 'off' | 'on';
57
60
  }
58
61
 
62
+ export interface DeepgramTTSOptions {}
63
+
59
64
  export interface RimeOptions {}
60
65
 
61
- export interface InworldOptions {}
66
+ export interface InworldOptions {
67
+ /** Controls how fast the voice speaks. 1.0 is normal speed, 0.5 is half, 1.5 is 1.5x. Default: 1.0. */
68
+ speaking_rate?: number;
69
+ /** Controls randomness in the output. Recommended between 0.6 and 1.1. Default: 1.1. */
70
+ temperature?: number;
71
+ /** Controls text normalization. "ON" expands numbers, dates, abbreviations. "OFF" reads text as written. Default: "ON". */
72
+ text_normalization?: 'ON' | 'OFF';
73
+ }
74
+
75
+ type _TTSModels =
76
+ | CartesiaModels
77
+ | DeepgramTTSModels
78
+ | ElevenlabsModels
79
+ | RimeModels
80
+ | InworldModels;
81
+
82
+ export type TTSModels =
83
+ | CartesiaModels
84
+ | DeepgramTTSModels
85
+ | ElevenlabsModels
86
+ | RimeModels
87
+ | InworldModels
88
+ | AnyString;
62
89
 
63
- export type TTSModels = CartesiaModels | ElevenlabsModels | RimeModels | InworldModels | AnyModels;
90
+ export type ModelWithVoice = `${_TTSModels}:${string}` | TTSModels;
64
91
 
65
92
  export type TTSOptions<TModel extends TTSModels> = TModel extends CartesiaModels
66
93
  ? CartesiaOptions
67
- : TModel extends ElevenlabsModels
68
- ? ElevenlabsOptions
69
- : TModel extends RimeOptions
70
- ? RimeOptions
71
- : TModel extends InworldOptions
72
- ? InworldOptions
73
- : Record<string, unknown>;
94
+ : TModel extends DeepgramTTSModels
95
+ ? DeepgramTTSOptions
96
+ : TModel extends ElevenlabsModels
97
+ ? ElevenlabsOptions
98
+ : TModel extends RimeModels
99
+ ? RimeOptions
100
+ : TModel extends InworldModels
101
+ ? InworldOptions
102
+ : Record<string, unknown>;
103
+
104
+ /** Parse a model string into [model, voice]. Voice is undefined if not specified. */
105
+ export function parseTTSModelString(model: string): [string, string | undefined] {
106
+ const idx = model.lastIndexOf(':');
107
+ if (idx !== -1) {
108
+ return [model.slice(0, idx), model.slice(idx + 1)];
109
+ }
110
+ return [model, undefined];
111
+ }
112
+
113
+ /** A fallback model with optional extra configuration. Extra fields are passed through to the provider. */
114
+ export interface TTSFallbackModel {
115
+ /** Model name (e.g. "cartesia/sonic", "elevenlabs/eleven_flash_v2", "rime/arcana"). */
116
+ model: string;
117
+ /** Voice to use for the model. */
118
+ voice: string;
119
+ /** Extra configuration for the model. */
120
+ extraKwargs?: Record<string, unknown>;
121
+ }
122
+
123
+ export type TTSFallbackModelType = TTSFallbackModel | string;
124
+
125
+ /** Normalize a single or list of FallbackModelType into TTSFallbackModel[]. */
126
+ export function normalizeTTSFallback(
127
+ fallback: TTSFallbackModelType | TTSFallbackModelType[],
128
+ ): TTSFallbackModel[] {
129
+ const makeFallback = (model: TTSFallbackModelType): TTSFallbackModel => {
130
+ if (typeof model === 'string') {
131
+ const [name, voice] = parseTTSModelString(model);
132
+ return { model: name, voice: voice ?? '' };
133
+ }
134
+ return model;
135
+ };
136
+
137
+ if (Array.isArray(fallback)) {
138
+ return fallback.map(makeFallback);
139
+ }
140
+ return [makeFallback(fallback)];
141
+ }
74
142
 
75
143
  type TTSEncoding = 'pcm_s16le';
76
144
 
77
145
  const DEFAULT_ENCODING: TTSEncoding = 'pcm_s16le';
78
146
  const DEFAULT_SAMPLE_RATE = 16000;
79
- const DEFAULT_BASE_URL = 'https://agent-gateway.livekit.cloud/v1';
80
147
  const NUM_CHANNELS = 1;
81
148
  const DEFAULT_LANGUAGE = 'en';
82
149
 
83
150
  export interface InferenceTTSOptions<TModel extends TTSModels> {
84
151
  model?: TModel;
85
152
  voice?: string;
86
- language?: string;
153
+ language?: LanguageCode;
87
154
  encoding: TTSEncoding;
88
155
  sampleRate: number;
89
156
  baseURL: string;
90
157
  apiKey: string;
91
158
  apiSecret: string;
92
- extraKwargs: TTSOptions<TModel>;
159
+ modelOptions: TTSOptions<TModel>;
160
+ fallback?: TTSFallbackModel[];
161
+ connOptions?: APIConnectOptions;
93
162
  }
94
163
 
164
+ /**
165
+ * Livekit Cloud Inference TTS
166
+ */
95
167
  export class TTS<TModel extends TTSModels> extends BaseTTS {
96
168
  private opts: InferenceTTSOptions<TModel>;
97
169
  private streams: Set<SynthesizeStream<TModel>> = new Set();
170
+ pool: ConnectionPool<WebSocket>;
98
171
 
99
172
  #logger = log();
100
173
 
@@ -107,7 +180,9 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
107
180
  sampleRate?: number;
108
181
  apiKey?: string;
109
182
  apiSecret?: string;
110
- extraKwargs?: TTSOptions<TModel>;
183
+ modelOptions?: TTSOptions<TModel>;
184
+ fallback?: TTSFallbackModelType | TTSFallbackModelType[];
185
+ connOptions?: APIConnectOptions;
111
186
  }) {
112
187
  const sampleRate = opts?.sampleRate ?? DEFAULT_SAMPLE_RATE;
113
188
  super(sampleRate, 1, { streaming: true });
@@ -120,10 +195,12 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
120
195
  encoding = DEFAULT_ENCODING,
121
196
  apiKey,
122
197
  apiSecret,
123
- extraKwargs = {} as TTSOptions<TModel>,
198
+ modelOptions = {} as TTSOptions<TModel>,
199
+ fallback,
200
+ connOptions,
124
201
  } = opts || {};
125
202
 
126
- const lkBaseURL = baseURL || process.env.LIVEKIT_INFERENCE_URL || DEFAULT_BASE_URL;
203
+ const lkBaseURL = baseURL || getDefaultInferenceUrl();
127
204
  const lkApiKey = apiKey || process.env.LIVEKIT_INFERENCE_API_KEY || process.env.LIVEKIT_API_KEY;
128
205
  if (!lkApiKey) {
129
206
  throw new Error('apiKey is required: pass apiKey or set LIVEKIT_API_KEY');
@@ -154,27 +231,57 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
154
231
  }
155
232
  }
156
233
 
234
+ const normalizedFallback = fallback ? normalizeTTSFallback(fallback) : undefined;
235
+
157
236
  this.opts = {
158
237
  model: nextModel,
159
238
  voice: nextVoice,
160
- language,
239
+ language: normalizeLanguage(language),
161
240
  encoding,
162
241
  sampleRate,
163
242
  baseURL: lkBaseURL,
164
243
  apiKey: lkApiKey,
165
244
  apiSecret: lkApiSecret,
166
- extraKwargs,
245
+ modelOptions,
246
+ fallback: normalizedFallback,
247
+ connOptions: connOptions ?? DEFAULT_API_CONNECT_OPTIONS,
167
248
  };
249
+
250
+ // Initialize connection pool
251
+ this.pool = new ConnectionPool<WebSocket>({
252
+ connectCb: (timeout) => this.connectWs(timeout),
253
+ closeCb: (ws) => this.closeWs(ws),
254
+ maxSessionDuration: 300_000,
255
+ markRefreshedOnGet: true,
256
+ connectTimeout: 10_000, // 10 seconds default
257
+ });
168
258
  }
169
259
 
170
260
  get label() {
171
261
  return 'inference.TTS';
172
262
  }
173
263
 
264
+ get model(): string {
265
+ return this.opts.model ?? 'unknown';
266
+ }
267
+
268
+ get provider(): string {
269
+ return 'livekit';
270
+ }
271
+
272
+ static fromModelString(modelString: string): TTS<AnyString> {
273
+ const [model, voice] = parseTTSModelString(modelString);
274
+ return new TTS({ model, voice: voice || undefined });
275
+ }
276
+
174
277
  updateOptions(opts: Partial<Pick<InferenceTTSOptions<TModel>, 'model' | 'voice' | 'language'>>) {
175
- this.opts = { ...this.opts, ...opts };
278
+ this.opts = {
279
+ ...this.opts,
280
+ ...opts,
281
+ language: opts.language !== undefined ? normalizeLanguage(opts.language) : this.opts.language,
282
+ };
176
283
  for (const stream of this.streams) {
177
- stream.updateOptions(opts);
284
+ stream.updateOptions(this.opts);
178
285
  }
179
286
  }
180
287
 
@@ -183,7 +290,7 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
183
290
  }
184
291
 
185
292
  stream(options?: { connOptions?: APIConnectOptions }): SynthesizeStream<TModel> {
186
- const { connOptions = DEFAULT_API_CONNECT_OPTIONS } = options || {};
293
+ const { connOptions = this.opts.connOptions ?? DEFAULT_API_CONNECT_OPTIONS } = options || {};
187
294
  const stream = new SynthesizeStream(this, { ...this.opts }, connOptions);
188
295
  this.streams.add(stream);
189
296
  return stream;
@@ -203,13 +310,31 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
203
310
  type: 'session.create',
204
311
  sample_rate: String(this.opts.sampleRate),
205
312
  encoding: this.opts.encoding,
206
- extra: this.opts.extraKwargs,
207
- } as TtsSessionCreateEvent;
313
+ extra: this.opts.modelOptions,
314
+ } as Record<string, unknown>;
315
+
316
+ if (this.opts.voice) (params as Record<string, unknown>).voice = this.opts.voice;
317
+ if (this.opts.model) (params as Record<string, unknown>).model = this.opts.model;
318
+ if (this.opts.language) (params as Record<string, unknown>).language = this.opts.language;
319
+
320
+ if (this.opts.fallback?.length) {
321
+ params.fallback = {
322
+ models: this.opts.fallback.map((m) => ({
323
+ model: m.model,
324
+ voice: m.voice,
325
+ extra: m.extraKwargs ?? {},
326
+ })),
327
+ };
328
+ }
208
329
 
209
- if (this.opts.voice) params.voice = this.opts.voice;
210
- if (this.opts.model) params.model = this.opts.model;
211
- if (this.opts.language) params.language = this.opts.language;
330
+ if (this.opts.connOptions) {
331
+ params.connection = {
332
+ timeout: this.opts.connOptions.timeoutMs / 1000,
333
+ retries: this.opts.connOptions.maxRetry,
334
+ };
335
+ }
212
336
 
337
+ this.#logger.debug({ url }, 'inference.TTS creating new websocket connection (pool miss)');
213
338
  const socket = await connectWs(url, headers, timeout);
214
339
  socket.send(JSON.stringify(params));
215
340
  return socket;
@@ -219,18 +344,22 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
219
344
  await ws.close();
220
345
  }
221
346
 
347
+ prewarm(): void {
348
+ this.pool.prewarm();
349
+ }
350
+
222
351
  async close() {
223
352
  for (const stream of this.streams) {
224
353
  await stream.close();
225
354
  }
226
355
  this.streams.clear();
356
+ await this.pool.close();
227
357
  }
228
358
  }
229
359
 
230
360
  export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeStream {
231
361
  private opts: InferenceTTSOptions<TModel>;
232
362
  private tts: TTS<TModel>;
233
- private connOptions: APIConnectOptions;
234
363
 
235
364
  #logger = log();
236
365
 
@@ -238,7 +367,6 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
238
367
  super(tts, connOptions);
239
368
  this.opts = opts;
240
369
  this.tts = tts;
241
- this.connOptions = connOptions;
242
370
  }
243
371
 
244
372
  get label() {
@@ -246,31 +374,39 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
246
374
  }
247
375
 
248
376
  updateOptions(opts: Partial<Pick<InferenceTTSOptions<TModel>, 'model' | 'voice' | 'language'>>) {
249
- this.opts = { ...this.opts, ...opts };
377
+ this.opts = {
378
+ ...this.opts,
379
+ ...opts,
380
+ language: opts.language !== undefined ? normalizeLanguage(opts.language) : this.opts.language,
381
+ };
250
382
  }
251
383
 
252
384
  protected async run(): Promise<void> {
253
- let ws: WebSocket | null = null;
254
385
  let closing = false;
255
- let finalReceived = false;
256
386
  let lastFrame: AudioFrame | undefined;
257
387
 
258
388
  const sendTokenizerStream = new tokenizeBasic.SentenceTokenizer().stream();
259
389
  const eventChannel = createStreamChannel<TtsServerEvent>();
260
390
  const requestId = shortuuid('tts_request_');
391
+ const inputSentEvent = new Event();
261
392
 
262
- const resourceCleanup = () => {
393
+ // Signal for protocol-driven completion (when 'done' message is received)
394
+ const completionFuture = new Future<void>();
395
+
396
+ const resourceCleanup = async () => {
263
397
  if (closing) return;
264
398
  closing = true;
265
399
  sendTokenizerStream.close();
266
- eventChannel.close();
267
- ws?.removeAllListeners();
268
- ws?.close();
400
+ // close() returns a promise; don't leak it
401
+ await eventChannel.close();
269
402
  };
270
403
 
271
- const sendClientEvent = async (event: TtsClientEvent) => {
404
+ const sendClientEvent = async (event: TtsClientEvent, ws: WebSocket, signal: AbortSignal) => {
405
+ // Don't send events to a closed WebSocket or aborted controller
406
+ if (signal.aborted || closing) return;
407
+
272
408
  const validatedEvent = await ttsClientEventSchema.parseAsync(event);
273
- if (!ws || ws.readyState !== WebSocket.OPEN) {
409
+ if (ws.readyState !== WebSocket.OPEN) {
274
410
  this.#logger.warn('Trying to send client TTS event to a closed WebSocket');
275
411
  return;
276
412
  }
@@ -284,67 +420,123 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
284
420
  }
285
421
  };
286
422
 
287
- const createInputTask = async () => {
423
+ const createInputTask = async (signal: AbortSignal) => {
288
424
  for await (const data of this.input) {
289
- if (this.abortController.signal.aborted) break;
425
+ if (signal.aborted || closing) break;
290
426
  if (data === SynthesizeStream.FLUSH_SENTINEL) {
291
427
  sendTokenizerStream.flush();
292
428
  continue;
293
429
  }
294
430
  sendTokenizerStream.pushText(data);
295
431
  }
296
- sendTokenizerStream.endInput();
432
+ // Only call endInput if the stream hasn't been closed by cleanup
433
+ if (!closing) {
434
+ sendTokenizerStream.endInput();
435
+ }
297
436
  };
298
437
 
299
- const createSentenceStreamTask = async () => {
438
+ const createSentenceStreamTask = async (ws: WebSocket, signal: AbortSignal) => {
300
439
  for await (const ev of sendTokenizerStream) {
301
- if (this.abortController.signal.aborted) break;
302
-
303
- sendClientEvent({
304
- type: 'input_transcript',
305
- transcript: ev.token + ' ',
306
- });
440
+ if (signal.aborted || closing) break;
441
+
442
+ await sendClientEvent(
443
+ {
444
+ type: 'input_transcript',
445
+ transcript: ev.token + ' ',
446
+ },
447
+ ws,
448
+ signal,
449
+ );
450
+ inputSentEvent.set();
307
451
  }
308
452
 
309
- sendClientEvent({ type: 'session.flush' });
453
+ await sendClientEvent({ type: 'session.flush' }, ws, signal);
454
+ // needed in case empty input is sent
455
+ inputSentEvent.set();
310
456
  };
311
457
 
312
- const createWsListenerTask = async (ws: WebSocket) => {
313
- return new Promise<void>((resolve, reject) => {
314
- this.abortController.signal.addEventListener('abort', () => {
315
- resourceCleanup();
316
- reject(new Error('WebSocket connection aborted'));
317
- });
318
-
319
- ws.on('message', async (data) => {
458
+ // Handles WebSocket message routing and error handling
459
+ // Completes based on protocol messages, NOT on ws.close()
460
+ const createWsListenerTask = async (ws: WebSocket, signal: AbortSignal) => {
461
+ const onMessage = (data: Buffer) => {
462
+ try {
320
463
  const eventJson = JSON.parse(data.toString()) as Record<string, unknown>;
321
464
  const validatedEvent = ttsServerEventSchema.parse(eventJson);
322
- eventChannel.write(validatedEvent);
323
- });
324
-
325
- ws.on('error', (e) => {
326
- this.#logger.error({ error: e }, 'WebSocket error');
327
- resourceCleanup();
328
- reject(e);
329
- });
330
-
331
- ws.on('close', () => {
332
- resourceCleanup();
333
-
334
- if (!closing) return this.#logger.error('WebSocket closed unexpectedly');
335
- if (finalReceived) return resolve();
465
+ // writer.write returns a promise; avoid unhandled rejections if stream is closed
466
+ void eventChannel.write(validatedEvent).catch((error) => {
467
+ this.#logger.debug(
468
+ { error },
469
+ 'Failed writing TTS event to stream channel (likely closed)',
470
+ );
471
+ });
472
+ } catch (e) {
473
+ this.#logger.error({ error: e }, 'Error parsing WebSocket message');
474
+ }
475
+ };
336
476
 
337
- reject(
477
+ const onError = (e: Error) => {
478
+ this.#logger.error({ error: e }, 'WebSocket error');
479
+ void resourceCleanup();
480
+ try {
481
+ // If the ws is misbehaving, hard-stop it immediately to avoid buffering.
482
+ ws.terminate?.();
483
+ } catch {
484
+ // ignore
485
+ }
486
+ // Ensure this ws is not reused
487
+ this.tts.pool.remove(ws);
488
+ completionFuture.reject(e);
489
+ };
490
+
491
+ const onClose = () => {
492
+ // WebSocket closed unexpectedly (not by us)
493
+ if (!closing) {
494
+ this.#logger.error('WebSocket closed unexpectedly');
495
+ void resourceCleanup();
496
+ // Ensure this ws is not reused
497
+ this.tts.pool.remove(ws);
498
+ completionFuture.reject(
338
499
  new APIStatusError({
339
500
  message: 'Gateway connection closed unexpectedly',
340
501
  options: { requestId },
341
502
  }),
342
503
  );
343
- });
344
- });
504
+ }
505
+ };
506
+
507
+ const onAbort = () => {
508
+ void resourceCleanup();
509
+ try {
510
+ // On interruption/abort, close the websocket immediately so the server stops streaming
511
+ // and the ws library doesn't buffer unread frames in memory.
512
+ ws.terminate?.();
513
+ } catch {
514
+ // ignore
515
+ }
516
+ this.tts.pool.remove(ws);
517
+ inputSentEvent.set();
518
+ completionFuture.resolve();
519
+ };
520
+
521
+ // Attach listeners
522
+ ws.on('message', onMessage);
523
+ ws.on('error', onError);
524
+ ws.on('close', onClose);
525
+ signal.addEventListener('abort', onAbort);
526
+
527
+ try {
528
+ // Wait for protocol-driven completion or error
529
+ await completionFuture.await;
530
+ } finally {
531
+ // IMPORTANT: Remove listeners so connection can be reused
532
+ ws.off('message', onMessage);
533
+ ws.off('error', onError);
534
+ ws.off('close', onClose);
535
+ signal.removeEventListener('abort', onAbort);
536
+ }
345
537
  };
346
538
 
347
- const createRecvTask = async () => {
539
+ const createRecvTask = async (signal: AbortSignal) => {
348
540
  let currentSessionId: string | null = null;
349
541
 
350
542
  const bstream = new AudioByteStream(this.opts.sampleRate, NUM_CHANNELS);
@@ -352,9 +544,11 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
352
544
  const reader = serverEventStream.getReader();
353
545
 
354
546
  try {
355
- while (!this.closed && !this.abortController.signal.aborted) {
547
+ await inputSentEvent.wait();
548
+
549
+ while (!this.closed && !signal.aborted) {
356
550
  const result = await reader.read();
357
- if (this.abortController.signal.aborted) return;
551
+ if (signal.aborted) return;
358
552
  if (result.done) return;
359
553
 
360
554
  const serverEvent = result.value;
@@ -370,24 +564,29 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
370
564
  }
371
565
  break;
372
566
  case 'done':
373
- finalReceived = true;
374
567
  for (const frame of bstream.flush()) {
375
568
  sendLastFrame(currentSessionId!, false);
376
569
  lastFrame = frame;
377
570
  }
378
571
  sendLastFrame(currentSessionId!, true);
379
572
  this.queue.put(SynthesizeStream.END_OF_STREAM);
380
- break;
573
+ await resourceCleanup();
574
+ completionFuture.resolve();
575
+ return;
381
576
  case 'session.closed':
382
- resourceCleanup();
383
- break;
577
+ await resourceCleanup();
578
+ completionFuture.resolve();
579
+ return;
384
580
  case 'error':
385
581
  this.#logger.error(
386
582
  { serverEvent },
387
583
  'Received error message from LiveKit TTS WebSocket',
388
584
  );
389
- resourceCleanup();
390
- throw new APIError(`LiveKit TTS returned error: ${serverEvent.message}`);
585
+ await resourceCleanup();
586
+ completionFuture.reject(
587
+ new APIError(`LiveKit TTS returned error: ${serverEvent.message}`),
588
+ );
589
+ return;
391
590
  default:
392
591
  this.#logger.warn('Unexpected message %s', serverEvent);
393
592
  break;
@@ -404,18 +603,81 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
404
603
  };
405
604
 
406
605
  try {
407
- ws = await this.tts.connectWs(this.connOptions.timeoutMs);
408
-
409
- await Promise.all([
410
- createInputTask(),
411
- createSentenceStreamTask(),
412
- createWsListenerTask(ws),
413
- createRecvTask(),
414
- ]);
606
+ await this.tts.pool.withConnection(
607
+ async (ws: WebSocket) => {
608
+ try {
609
+ // IMPORTANT: don't cancel the stream's controller on normal completion,
610
+ // otherwise the pool will remove+close the ws and every run becomes a pool miss.
611
+ const runController = new AbortController();
612
+ const onStreamAbort = () => runController.abort(this.abortController.signal.reason);
613
+ this.abortController.signal.addEventListener('abort', onStreamAbort, { once: true });
614
+
615
+ const tasks = [
616
+ Task.from(
617
+ async (controller) => {
618
+ const combined = combineSignals(runController.signal, controller.signal);
619
+ await createInputTask(combined);
620
+ },
621
+ undefined,
622
+ 'inference-tts-input',
623
+ ),
624
+ Task.from(
625
+ async (controller) => {
626
+ const combined = combineSignals(runController.signal, controller.signal);
627
+ await createSentenceStreamTask(ws, combined);
628
+ },
629
+ undefined,
630
+ 'inference-tts-sentence',
631
+ ),
632
+ Task.from(
633
+ async (controller) => {
634
+ const combined = combineSignals(runController.signal, controller.signal);
635
+ await createWsListenerTask(ws, combined);
636
+ },
637
+ undefined,
638
+ 'inference-tts-ws-listener',
639
+ ),
640
+ Task.from(
641
+ async (controller) => {
642
+ const combined = combineSignals(runController.signal, controller.signal);
643
+ await createRecvTask(combined);
644
+ },
645
+ undefined,
646
+ 'inference-tts-recv',
647
+ ),
648
+ ];
649
+
650
+ try {
651
+ await Promise.all(tasks.map((t) => t.result));
652
+ } finally {
653
+ // Mirror python finally: unblock recv and cancel all tasks.
654
+ inputSentEvent.set();
655
+ await resourceCleanup();
656
+ await cancelAndWait(tasks, 5000);
657
+ this.abortController.signal.removeEventListener('abort', onStreamAbort);
658
+ }
659
+ } catch (e) {
660
+ // If aborted, don't throw - let cleanup handle it
661
+ if (e instanceof Error && e.name === 'AbortError') {
662
+ return;
663
+ }
664
+ throw e;
665
+ }
666
+ },
667
+ {
668
+ timeout: this.connOptions.timeoutMs,
669
+ },
670
+ );
415
671
  } catch (e) {
416
- this.#logger.error('Error in SynthesizeStream', { error: e });
672
+ // Handle connection errors
673
+ if (e instanceof Error && e.name === 'AbortError') {
674
+ // Abort is expected during normal shutdown
675
+ return;
676
+ }
677
+ throw e;
417
678
  } finally {
418
- resourceCleanup();
679
+ // Ensure cleanup always runs (and don't leak the promise)
680
+ await resourceCleanup();
419
681
  }
420
682
  }
421
683
  }