@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
@@ -5,96 +5,208 @@ 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
+ 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';
40
45
 
41
- export type _RimeModels = 'rime' | 'rime/mist' | 'rime/mistv2' | 'rime/arcana';
46
+ export type RimeModels = 'rime/arcana' | 'rime/mistv2';
42
47
 
43
- export type RimeModels = _RimeModels | `${_RimeModels}:${string}`;
48
+ export interface CartesiaOptions {
49
+ emotion?: string;
50
+ /** Maximum duration of audio in seconds. */
51
+ duration?: number;
52
+ /** Speech speed. Default: not specified. */
53
+ speed?: 'slow' | 'normal' | 'fast' | number;
54
+ volume?: number;
55
+ max_buffer_delay_ms?: number;
56
+ add_timestamps?: boolean;
57
+ add_phoneme_timestamps?: boolean;
58
+ use_normalized_timestamps?: boolean;
59
+ }
44
60
 
45
- export type _InworldModels = 'inworld' | 'inworld/inworld-tts-1';
61
+ export interface ElevenlabsOptions {
62
+ /** Inactivity timeout in seconds. Default: 60. */
63
+ inactivity_timeout?: number;
64
+ /** Text normalization mode. Default: "auto". */
65
+ apply_text_normalization?: 'auto' | 'off' | 'on';
66
+ auto_mode?: boolean;
67
+ enable_logging?: boolean;
68
+ enable_ssml_parsing?: boolean;
69
+ sync_alignment?: boolean;
70
+ language_code?: string;
71
+ /** Voice stability tuning, typically in the range [0, 1]. */
72
+ stability?: number;
73
+ /** Voice similarity tuning, typically in the range [0, 1]. */
74
+ similarity_boost?: number;
75
+ /** Style exaggeration tuning, typically in the range [0, 1]. */
76
+ style?: number;
77
+ /** Speech speed multiplier. */
78
+ speed?: number;
79
+ use_speaker_boost?: boolean;
80
+ chunk_length_schedule?: number[];
81
+ preferred_alignment?: string;
82
+ }
46
83
 
47
- export type InworldModels = _InworldModels | `${_InworldModels}:${string}`;
84
+ export interface DeepgramTTSOptions {
85
+ /** Default: false. */
86
+ mip_opt_out?: boolean;
87
+ }
48
88
 
49
- export interface CartesiaOptions {
50
- duration?: number; // max duration of audio in seconds
51
- speed?: 'slow' | 'normal' | 'fast'; // default: not specified
89
+ export interface RimeOptions {
90
+ /** Default 1.0, <1 = faster, >1 = slower. */
91
+ speed_alpha?: number;
92
+ /** Default false. */
93
+ pause_between_brackets?: boolean;
94
+ /** Default false. */
95
+ phonemize_between_brackets?: boolean;
96
+ /** Comma-separated speed factors for [bracketed] words. */
97
+ inline_speed_alpha?: string;
98
+ /** Default false. */
99
+ no_text_normalization?: boolean;
52
100
  }
53
101
 
54
- export interface ElevenlabsOptions {
55
- inactivity_timeout?: number; // default: 60
56
- apply_text_normalization?: 'auto' | 'off' | 'on'; // default: "auto"
102
+ export interface InworldOptions {
103
+ /** Range >0.5, <=1.5. */
104
+ speaking_rate?: number;
105
+ /** Range 0-2. */
106
+ temperature?: number;
107
+ timestamp_type?: 'TIMESTAMP_TYPE_UNSPECIFIED' | 'WORD' | 'CHARACTER';
108
+ apply_text_normalization?: 'APPLY_TEXT_NORMALIZATION_UNSPECIFIED' | 'ON' | 'OFF';
109
+ /** @deprecated Backward-compatible alias. Use `apply_text_normalization`. */
110
+ text_normalization?: 'ON' | 'OFF';
57
111
  }
58
112
 
59
- export interface RimeOptions {}
113
+ type _TTSModels =
114
+ | CartesiaModels
115
+ | DeepgramTTSModels
116
+ | ElevenlabsModels
117
+ | RimeModels
118
+ | InworldModels;
60
119
 
61
- export interface InworldOptions {}
120
+ export type TTSModels =
121
+ | CartesiaModels
122
+ | DeepgramTTSModels
123
+ | ElevenlabsModels
124
+ | RimeModels
125
+ | InworldModels
126
+ | AnyString;
62
127
 
63
- export type TTSModels = CartesiaModels | ElevenlabsModels | RimeModels | InworldModels | AnyModels;
128
+ export type ModelWithVoice = `${_TTSModels}:${string}` | TTSModels;
64
129
 
65
130
  export type TTSOptions<TModel extends TTSModels> = TModel extends CartesiaModels
66
131
  ? CartesiaOptions
67
- : TModel extends ElevenlabsModels
68
- ? ElevenlabsOptions
69
- : TModel extends RimeOptions
70
- ? RimeOptions
71
- : TModel extends InworldOptions
72
- ? InworldOptions
73
- : Record<string, unknown>;
132
+ : TModel extends DeepgramTTSModels
133
+ ? DeepgramTTSOptions
134
+ : TModel extends ElevenlabsModels
135
+ ? ElevenlabsOptions
136
+ : TModel extends RimeModels
137
+ ? RimeOptions
138
+ : TModel extends InworldModels
139
+ ? InworldOptions
140
+ : Record<string, unknown>;
141
+
142
+ /** Parse a model string into [model, voice]. Voice is undefined if not specified. */
143
+ export function parseTTSModelString(model: string): [string, string | undefined] {
144
+ const idx = model.lastIndexOf(':');
145
+ if (idx !== -1) {
146
+ return [model.slice(0, idx), model.slice(idx + 1)];
147
+ }
148
+ return [model, undefined];
149
+ }
150
+
151
+ /** A fallback model with optional extra configuration. Extra fields are passed through to the provider. */
152
+ export interface TTSFallbackModel {
153
+ /** Model name (e.g. "cartesia/sonic", "elevenlabs/eleven_flash_v2", "rime/arcana"). */
154
+ model: string;
155
+ /** Voice to use for the model. */
156
+ voice: string;
157
+ /** Extra configuration for the model. */
158
+ extraKwargs?: Record<string, unknown>;
159
+ }
160
+
161
+ export type TTSFallbackModelType = TTSFallbackModel | string;
162
+
163
+ /** Normalize a single or list of FallbackModelType into TTSFallbackModel[]. */
164
+ export function normalizeTTSFallback(
165
+ fallback: TTSFallbackModelType | TTSFallbackModelType[],
166
+ ): TTSFallbackModel[] {
167
+ const makeFallback = (model: TTSFallbackModelType): TTSFallbackModel => {
168
+ if (typeof model === 'string') {
169
+ const [name, voice] = parseTTSModelString(model);
170
+ return { model: name, voice: voice ?? '' };
171
+ }
172
+ return model;
173
+ };
174
+
175
+ if (Array.isArray(fallback)) {
176
+ return fallback.map(makeFallback);
177
+ }
178
+ return [makeFallback(fallback)];
179
+ }
74
180
 
75
181
  type TTSEncoding = 'pcm_s16le';
76
182
 
77
183
  const DEFAULT_ENCODING: TTSEncoding = 'pcm_s16le';
78
184
  const DEFAULT_SAMPLE_RATE = 16000;
79
- const DEFAULT_BASE_URL = 'https://agent-gateway.livekit.cloud/v1';
80
185
  const NUM_CHANNELS = 1;
81
186
  const DEFAULT_LANGUAGE = 'en';
82
187
 
83
188
  export interface InferenceTTSOptions<TModel extends TTSModels> {
84
189
  model?: TModel;
85
190
  voice?: string;
86
- language?: string;
191
+ language?: LanguageCode;
87
192
  encoding: TTSEncoding;
88
193
  sampleRate: number;
89
194
  baseURL: string;
90
195
  apiKey: string;
91
196
  apiSecret: string;
92
- extraKwargs: TTSOptions<TModel>;
197
+ /** Flat provider-specific inference options forwarded as the `extra` payload field. */
198
+ modelOptions: TTSOptions<TModel>;
199
+ fallback?: TTSFallbackModel[];
200
+ connOptions?: APIConnectOptions;
93
201
  }
94
202
 
203
+ /**
204
+ * Livekit Cloud Inference TTS
205
+ */
95
206
  export class TTS<TModel extends TTSModels> extends BaseTTS {
96
207
  private opts: InferenceTTSOptions<TModel>;
97
208
  private streams: Set<SynthesizeStream<TModel>> = new Set();
209
+ pool: ConnectionPool<WebSocket>;
98
210
 
99
211
  #logger = log();
100
212
 
@@ -107,7 +219,10 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
107
219
  sampleRate?: number;
108
220
  apiKey?: string;
109
221
  apiSecret?: string;
110
- extraKwargs?: TTSOptions<TModel>;
222
+ /** Flat provider-specific inference options forwarded as the `extra` payload field. */
223
+ modelOptions?: TTSOptions<TModel>;
224
+ fallback?: TTSFallbackModelType | TTSFallbackModelType[];
225
+ connOptions?: APIConnectOptions;
111
226
  }) {
112
227
  const sampleRate = opts?.sampleRate ?? DEFAULT_SAMPLE_RATE;
113
228
  super(sampleRate, 1, { streaming: true });
@@ -120,10 +235,12 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
120
235
  encoding = DEFAULT_ENCODING,
121
236
  apiKey,
122
237
  apiSecret,
123
- extraKwargs = {} as TTSOptions<TModel>,
238
+ modelOptions = {} as TTSOptions<TModel>,
239
+ fallback,
240
+ connOptions,
124
241
  } = opts || {};
125
242
 
126
- const lkBaseURL = baseURL || process.env.LIVEKIT_INFERENCE_URL || DEFAULT_BASE_URL;
243
+ const lkBaseURL = baseURL || getDefaultInferenceUrl();
127
244
  const lkApiKey = apiKey || process.env.LIVEKIT_INFERENCE_API_KEY || process.env.LIVEKIT_API_KEY;
128
245
  if (!lkApiKey) {
129
246
  throw new Error('apiKey is required: pass apiKey or set LIVEKIT_API_KEY');
@@ -154,27 +271,57 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
154
271
  }
155
272
  }
156
273
 
274
+ const normalizedFallback = fallback ? normalizeTTSFallback(fallback) : undefined;
275
+
157
276
  this.opts = {
158
277
  model: nextModel,
159
278
  voice: nextVoice,
160
- language,
279
+ language: normalizeLanguage(language),
161
280
  encoding,
162
281
  sampleRate,
163
282
  baseURL: lkBaseURL,
164
283
  apiKey: lkApiKey,
165
284
  apiSecret: lkApiSecret,
166
- extraKwargs,
285
+ modelOptions,
286
+ fallback: normalizedFallback,
287
+ connOptions: connOptions ?? DEFAULT_API_CONNECT_OPTIONS,
167
288
  };
289
+
290
+ // Initialize connection pool
291
+ this.pool = new ConnectionPool<WebSocket>({
292
+ connectCb: (timeout) => this.connectWs(timeout),
293
+ closeCb: (ws) => this.closeWs(ws),
294
+ maxSessionDuration: 300_000,
295
+ markRefreshedOnGet: true,
296
+ connectTimeout: 10_000, // 10 seconds default
297
+ });
168
298
  }
169
299
 
170
300
  get label() {
171
301
  return 'inference.TTS';
172
302
  }
173
303
 
304
+ get model(): string {
305
+ return this.opts.model ?? 'unknown';
306
+ }
307
+
308
+ get provider(): string {
309
+ return 'livekit';
310
+ }
311
+
312
+ static fromModelString(modelString: string): TTS<AnyString> {
313
+ const [model, voice] = parseTTSModelString(modelString);
314
+ return new TTS({ model, voice: voice || undefined });
315
+ }
316
+
174
317
  updateOptions(opts: Partial<Pick<InferenceTTSOptions<TModel>, 'model' | 'voice' | 'language'>>) {
175
- this.opts = { ...this.opts, ...opts };
318
+ this.opts = {
319
+ ...this.opts,
320
+ ...opts,
321
+ language: opts.language !== undefined ? normalizeLanguage(opts.language) : this.opts.language,
322
+ };
176
323
  for (const stream of this.streams) {
177
- stream.updateOptions(opts);
324
+ stream.updateOptions(this.opts);
178
325
  }
179
326
  }
180
327
 
@@ -183,7 +330,7 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
183
330
  }
184
331
 
185
332
  stream(options?: { connOptions?: APIConnectOptions }): SynthesizeStream<TModel> {
186
- const { connOptions = DEFAULT_API_CONNECT_OPTIONS } = options || {};
333
+ const { connOptions = this.opts.connOptions ?? DEFAULT_API_CONNECT_OPTIONS } = options || {};
187
334
  const stream = new SynthesizeStream(this, { ...this.opts }, connOptions);
188
335
  this.streams.add(stream);
189
336
  return stream;
@@ -203,13 +350,31 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
203
350
  type: 'session.create',
204
351
  sample_rate: String(this.opts.sampleRate),
205
352
  encoding: this.opts.encoding,
206
- extra: this.opts.extraKwargs,
207
- } as TtsSessionCreateEvent;
353
+ extra: this.opts.modelOptions,
354
+ } as Record<string, unknown>;
355
+
356
+ if (this.opts.voice) (params as Record<string, unknown>).voice = this.opts.voice;
357
+ if (this.opts.model) (params as Record<string, unknown>).model = this.opts.model;
358
+ if (this.opts.language) (params as Record<string, unknown>).language = this.opts.language;
359
+
360
+ if (this.opts.fallback?.length) {
361
+ params.fallback = {
362
+ models: this.opts.fallback.map((m) => ({
363
+ model: m.model,
364
+ voice: m.voice,
365
+ extra: m.extraKwargs ?? {},
366
+ })),
367
+ };
368
+ }
208
369
 
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;
370
+ if (this.opts.connOptions) {
371
+ params.connection = {
372
+ timeout: this.opts.connOptions.timeoutMs / 1000,
373
+ retries: this.opts.connOptions.maxRetry,
374
+ };
375
+ }
212
376
 
377
+ this.#logger.debug({ url }, 'inference.TTS creating new websocket connection (pool miss)');
213
378
  const socket = await connectWs(url, headers, timeout);
214
379
  socket.send(JSON.stringify(params));
215
380
  return socket;
@@ -219,18 +384,22 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
219
384
  await ws.close();
220
385
  }
221
386
 
387
+ prewarm(): void {
388
+ this.pool.prewarm();
389
+ }
390
+
222
391
  async close() {
223
392
  for (const stream of this.streams) {
224
393
  await stream.close();
225
394
  }
226
395
  this.streams.clear();
396
+ await this.pool.close();
227
397
  }
228
398
  }
229
399
 
230
400
  export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeStream {
231
401
  private opts: InferenceTTSOptions<TModel>;
232
402
  private tts: TTS<TModel>;
233
- private connOptions: APIConnectOptions;
234
403
 
235
404
  #logger = log();
236
405
 
@@ -238,7 +407,6 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
238
407
  super(tts, connOptions);
239
408
  this.opts = opts;
240
409
  this.tts = tts;
241
- this.connOptions = connOptions;
242
410
  }
243
411
 
244
412
  get label() {
@@ -246,31 +414,39 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
246
414
  }
247
415
 
248
416
  updateOptions(opts: Partial<Pick<InferenceTTSOptions<TModel>, 'model' | 'voice' | 'language'>>) {
249
- this.opts = { ...this.opts, ...opts };
417
+ this.opts = {
418
+ ...this.opts,
419
+ ...opts,
420
+ language: opts.language !== undefined ? normalizeLanguage(opts.language) : this.opts.language,
421
+ };
250
422
  }
251
423
 
252
424
  protected async run(): Promise<void> {
253
- let ws: WebSocket | null = null;
254
425
  let closing = false;
255
- let finalReceived = false;
256
426
  let lastFrame: AudioFrame | undefined;
257
427
 
258
428
  const sendTokenizerStream = new tokenizeBasic.SentenceTokenizer().stream();
259
429
  const eventChannel = createStreamChannel<TtsServerEvent>();
260
430
  const requestId = shortuuid('tts_request_');
431
+ const inputSentEvent = new Event();
261
432
 
262
- const resourceCleanup = () => {
433
+ // Signal for protocol-driven completion (when 'done' message is received)
434
+ const completionFuture = new Future<void>();
435
+
436
+ const resourceCleanup = async () => {
263
437
  if (closing) return;
264
438
  closing = true;
265
439
  sendTokenizerStream.close();
266
- eventChannel.close();
267
- ws?.removeAllListeners();
268
- ws?.close();
440
+ // close() returns a promise; don't leak it
441
+ await eventChannel.close();
269
442
  };
270
443
 
271
- const sendClientEvent = async (event: TtsClientEvent) => {
444
+ const sendClientEvent = async (event: TtsClientEvent, ws: WebSocket, signal: AbortSignal) => {
445
+ // Don't send events to a closed WebSocket or aborted controller
446
+ if (signal.aborted || closing) return;
447
+
272
448
  const validatedEvent = await ttsClientEventSchema.parseAsync(event);
273
- if (!ws || ws.readyState !== WebSocket.OPEN) {
449
+ if (ws.readyState !== WebSocket.OPEN) {
274
450
  this.#logger.warn('Trying to send client TTS event to a closed WebSocket');
275
451
  return;
276
452
  }
@@ -284,67 +460,123 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
284
460
  }
285
461
  };
286
462
 
287
- const createInputTask = async () => {
463
+ const createInputTask = async (signal: AbortSignal) => {
288
464
  for await (const data of this.input) {
289
- if (this.abortController.signal.aborted) break;
465
+ if (signal.aborted || closing) break;
290
466
  if (data === SynthesizeStream.FLUSH_SENTINEL) {
291
467
  sendTokenizerStream.flush();
292
468
  continue;
293
469
  }
294
470
  sendTokenizerStream.pushText(data);
295
471
  }
296
- sendTokenizerStream.endInput();
472
+ // Only call endInput if the stream hasn't been closed by cleanup
473
+ if (!closing) {
474
+ sendTokenizerStream.endInput();
475
+ }
297
476
  };
298
477
 
299
- const createSentenceStreamTask = async () => {
478
+ const createSentenceStreamTask = async (ws: WebSocket, signal: AbortSignal) => {
300
479
  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
- });
480
+ if (signal.aborted || closing) break;
481
+
482
+ await sendClientEvent(
483
+ {
484
+ type: 'input_transcript',
485
+ transcript: ev.token + ' ',
486
+ },
487
+ ws,
488
+ signal,
489
+ );
490
+ inputSentEvent.set();
307
491
  }
308
492
 
309
- sendClientEvent({ type: 'session.flush' });
493
+ await sendClientEvent({ type: 'session.flush' }, ws, signal);
494
+ // needed in case empty input is sent
495
+ inputSentEvent.set();
310
496
  };
311
497
 
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) => {
498
+ // Handles WebSocket message routing and error handling
499
+ // Completes based on protocol messages, NOT on ws.close()
500
+ const createWsListenerTask = async (ws: WebSocket, signal: AbortSignal) => {
501
+ const onMessage = (data: Buffer) => {
502
+ try {
320
503
  const eventJson = JSON.parse(data.toString()) as Record<string, unknown>;
321
504
  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();
505
+ // writer.write returns a promise; avoid unhandled rejections if stream is closed
506
+ void eventChannel.write(validatedEvent).catch((error) => {
507
+ this.#logger.debug(
508
+ { error },
509
+ 'Failed writing TTS event to stream channel (likely closed)',
510
+ );
511
+ });
512
+ } catch (e) {
513
+ this.#logger.error({ error: e }, 'Error parsing WebSocket message');
514
+ }
515
+ };
336
516
 
337
- reject(
517
+ const onError = (e: Error) => {
518
+ this.#logger.error({ error: e }, 'WebSocket error');
519
+ void resourceCleanup();
520
+ try {
521
+ // If the ws is misbehaving, hard-stop it immediately to avoid buffering.
522
+ ws.terminate?.();
523
+ } catch {
524
+ // ignore
525
+ }
526
+ // Ensure this ws is not reused
527
+ this.tts.pool.remove(ws);
528
+ completionFuture.reject(e);
529
+ };
530
+
531
+ const onClose = () => {
532
+ // WebSocket closed unexpectedly (not by us)
533
+ if (!closing) {
534
+ this.#logger.error('WebSocket closed unexpectedly');
535
+ void resourceCleanup();
536
+ // Ensure this ws is not reused
537
+ this.tts.pool.remove(ws);
538
+ completionFuture.reject(
338
539
  new APIStatusError({
339
540
  message: 'Gateway connection closed unexpectedly',
340
541
  options: { requestId },
341
542
  }),
342
543
  );
343
- });
344
- });
544
+ }
545
+ };
546
+
547
+ const onAbort = () => {
548
+ void resourceCleanup();
549
+ try {
550
+ // On interruption/abort, close the websocket immediately so the server stops streaming
551
+ // and the ws library doesn't buffer unread frames in memory.
552
+ ws.terminate?.();
553
+ } catch {
554
+ // ignore
555
+ }
556
+ this.tts.pool.remove(ws);
557
+ inputSentEvent.set();
558
+ completionFuture.resolve();
559
+ };
560
+
561
+ // Attach listeners
562
+ ws.on('message', onMessage);
563
+ ws.on('error', onError);
564
+ ws.on('close', onClose);
565
+ signal.addEventListener('abort', onAbort);
566
+
567
+ try {
568
+ // Wait for protocol-driven completion or error
569
+ await completionFuture.await;
570
+ } finally {
571
+ // IMPORTANT: Remove listeners so connection can be reused
572
+ ws.off('message', onMessage);
573
+ ws.off('error', onError);
574
+ ws.off('close', onClose);
575
+ signal.removeEventListener('abort', onAbort);
576
+ }
345
577
  };
346
578
 
347
- const createRecvTask = async () => {
579
+ const createRecvTask = async (signal: AbortSignal) => {
348
580
  let currentSessionId: string | null = null;
349
581
 
350
582
  const bstream = new AudioByteStream(this.opts.sampleRate, NUM_CHANNELS);
@@ -352,9 +584,11 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
352
584
  const reader = serverEventStream.getReader();
353
585
 
354
586
  try {
355
- while (!this.closed && !this.abortController.signal.aborted) {
587
+ await inputSentEvent.wait();
588
+
589
+ while (!this.closed && !signal.aborted) {
356
590
  const result = await reader.read();
357
- if (this.abortController.signal.aborted) return;
591
+ if (signal.aborted) return;
358
592
  if (result.done) return;
359
593
 
360
594
  const serverEvent = result.value;
@@ -370,24 +604,29 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
370
604
  }
371
605
  break;
372
606
  case 'done':
373
- finalReceived = true;
374
607
  for (const frame of bstream.flush()) {
375
608
  sendLastFrame(currentSessionId!, false);
376
609
  lastFrame = frame;
377
610
  }
378
611
  sendLastFrame(currentSessionId!, true);
379
612
  this.queue.put(SynthesizeStream.END_OF_STREAM);
380
- break;
613
+ await resourceCleanup();
614
+ completionFuture.resolve();
615
+ return;
381
616
  case 'session.closed':
382
- resourceCleanup();
383
- break;
617
+ await resourceCleanup();
618
+ completionFuture.resolve();
619
+ return;
384
620
  case 'error':
385
621
  this.#logger.error(
386
622
  { serverEvent },
387
623
  'Received error message from LiveKit TTS WebSocket',
388
624
  );
389
- resourceCleanup();
390
- throw new APIError(`LiveKit TTS returned error: ${serverEvent.message}`);
625
+ await resourceCleanup();
626
+ completionFuture.reject(
627
+ new APIError(`LiveKit TTS returned error: ${serverEvent.message}`),
628
+ );
629
+ return;
391
630
  default:
392
631
  this.#logger.warn('Unexpected message %s', serverEvent);
393
632
  break;
@@ -404,18 +643,81 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
404
643
  };
405
644
 
406
645
  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
- ]);
646
+ await this.tts.pool.withConnection(
647
+ async (ws: WebSocket) => {
648
+ try {
649
+ // IMPORTANT: don't cancel the stream's controller on normal completion,
650
+ // otherwise the pool will remove+close the ws and every run becomes a pool miss.
651
+ const runController = new AbortController();
652
+ const onStreamAbort = () => runController.abort(this.abortController.signal.reason);
653
+ this.abortController.signal.addEventListener('abort', onStreamAbort, { once: true });
654
+
655
+ const tasks = [
656
+ Task.from(
657
+ async (controller) => {
658
+ const combined = combineSignals(runController.signal, controller.signal);
659
+ await createInputTask(combined);
660
+ },
661
+ undefined,
662
+ 'inference-tts-input',
663
+ ),
664
+ Task.from(
665
+ async (controller) => {
666
+ const combined = combineSignals(runController.signal, controller.signal);
667
+ await createSentenceStreamTask(ws, combined);
668
+ },
669
+ undefined,
670
+ 'inference-tts-sentence',
671
+ ),
672
+ Task.from(
673
+ async (controller) => {
674
+ const combined = combineSignals(runController.signal, controller.signal);
675
+ await createWsListenerTask(ws, combined);
676
+ },
677
+ undefined,
678
+ 'inference-tts-ws-listener',
679
+ ),
680
+ Task.from(
681
+ async (controller) => {
682
+ const combined = combineSignals(runController.signal, controller.signal);
683
+ await createRecvTask(combined);
684
+ },
685
+ undefined,
686
+ 'inference-tts-recv',
687
+ ),
688
+ ];
689
+
690
+ try {
691
+ await Promise.all(tasks.map((t) => t.result));
692
+ } finally {
693
+ // Mirror python finally: unblock recv and cancel all tasks.
694
+ inputSentEvent.set();
695
+ await resourceCleanup();
696
+ await cancelAndWait(tasks, 5000);
697
+ this.abortController.signal.removeEventListener('abort', onStreamAbort);
698
+ }
699
+ } catch (e) {
700
+ // If aborted, don't throw - let cleanup handle it
701
+ if (e instanceof Error && e.name === 'AbortError') {
702
+ return;
703
+ }
704
+ throw e;
705
+ }
706
+ },
707
+ {
708
+ timeout: this.connOptions.timeoutMs,
709
+ },
710
+ );
415
711
  } catch (e) {
416
- this.#logger.error('Error in SynthesizeStream', { error: e });
712
+ // Handle connection errors
713
+ if (e instanceof Error && e.name === 'AbortError') {
714
+ // Abort is expected during normal shutdown
715
+ return;
716
+ }
717
+ throw e;
417
718
  } finally {
418
- resourceCleanup();
719
+ // Ensure cleanup always runs (and don't leak the promise)
720
+ await resourceCleanup();
419
721
  }
420
722
  }
421
723
  }