@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
package/src/tts/index.ts CHANGED
@@ -10,3 +10,4 @@ export {
10
10
  ChunkedStream,
11
11
  } from './tts.js';
12
12
  export { StreamAdapter, StreamAdapterWrapper } from './stream_adapter.js';
13
+ export { FallbackAdapter, type AvailabilityChangedEvent } from './fallback_adapter.js';
@@ -2,7 +2,10 @@
2
2
  //
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  import type { SentenceStream, SentenceTokenizer } from '../tokenize/index.js';
5
+ import type { APIConnectOptions } from '../types.js';
6
+ import { USERDATA_TIMED_TRANSCRIPT } from '../types.js';
5
7
  import { Task } from '../utils.js';
8
+ import { createTimedString } from '../voice/io.js';
6
9
  import type { ChunkedStream } from './tts.js';
7
10
  import { SynthesizeStream, TTS } from './tts.js';
8
11
 
@@ -12,7 +15,7 @@ export class StreamAdapter extends TTS {
12
15
  label: string;
13
16
 
14
17
  constructor(tts: TTS, sentenceTokenizer: SentenceTokenizer) {
15
- super(tts.sampleRate, tts.numChannels, { streaming: true });
18
+ super(tts.sampleRate, tts.numChannels, { streaming: true, alignedTranscript: true });
16
19
  this.#tts = tts;
17
20
  this.#sentenceTokenizer = sentenceTokenizer;
18
21
  this.label = this.#tts.label;
@@ -21,14 +24,21 @@ export class StreamAdapter extends TTS {
21
24
  this.#tts.on('metrics_collected', (metrics) => {
22
25
  this.emit('metrics_collected', metrics);
23
26
  });
27
+ this.#tts.on('error', (error) => {
28
+ this.emit('error', error);
29
+ });
24
30
  }
25
31
 
26
- synthesize(text: string): ChunkedStream {
27
- return this.#tts.synthesize(text);
32
+ synthesize(
33
+ text: string,
34
+ connOptions?: APIConnectOptions,
35
+ abortSignal?: AbortSignal,
36
+ ): ChunkedStream {
37
+ return this.#tts.synthesize(text, connOptions, abortSignal);
28
38
  }
29
39
 
30
- stream(): StreamAdapterWrapper {
31
- return new StreamAdapterWrapper(this.#tts, this.#sentenceTokenizer);
40
+ stream(options?: { connOptions?: APIConnectOptions }): StreamAdapterWrapper {
41
+ return new StreamAdapterWrapper(this.#tts, this.#sentenceTokenizer, options?.connOptions);
32
42
  }
33
43
  }
34
44
 
@@ -37,14 +47,16 @@ export class StreamAdapterWrapper extends SynthesizeStream {
37
47
  #sentenceStream: SentenceStream;
38
48
  label: string;
39
49
 
40
- constructor(tts: TTS, sentenceTokenizer: SentenceTokenizer) {
41
- super(tts);
50
+ constructor(tts: TTS, sentenceTokenizer: SentenceTokenizer, connOptions?: APIConnectOptions) {
51
+ super(tts, connOptions);
42
52
  this.#tts = tts;
43
53
  this.#sentenceStream = sentenceTokenizer.stream();
44
54
  this.label = `tts.StreamAdapterWrapper<${this.#tts.label}>`;
45
55
  }
46
56
 
47
57
  protected async run() {
58
+ let cumulativeDuration = 0;
59
+
48
60
  const forwardInput = async () => {
49
61
  for await (const input of this.input) {
50
62
  if (this.abortController.signal.aborted) break;
@@ -84,15 +96,33 @@ export class StreamAdapterWrapper extends SynthesizeStream {
84
96
  prevTask: Task<void> | undefined,
85
97
  controller: AbortController,
86
98
  ) => {
87
- const audioStream = this.#tts.synthesize(token);
99
+ const audioStream = this.#tts.synthesize(token, this.connOptions, this.abortSignal);
88
100
 
89
101
  // wait for previous audio transcription to complete before starting
90
102
  // to queuing audio frames of the current token
91
103
  await prevTask?.result;
92
104
  if (controller.signal.aborted) return;
93
105
 
106
+ // Create a TimedString with the sentence text and current cumulative duration
107
+ const timedString = createTimedString({
108
+ text: token,
109
+ startTime: cumulativeDuration,
110
+ });
111
+
112
+ let isFirstFrame = true;
94
113
  for await (const audio of audioStream) {
95
114
  if (controller.signal.aborted) break;
115
+
116
+ // Attach the TimedString to the first frame of this sentence
117
+ if (isFirstFrame) {
118
+ audio.frame.userdata[USERDATA_TIMED_TRANSCRIPT] = [timedString];
119
+ isFirstFrame = false;
120
+ }
121
+
122
+ // Track cumulative duration
123
+ const frameDuration = audio.frame.samplesPerChannel / audio.frame.sampleRate;
124
+ cumulativeDuration += frameDuration;
125
+
96
126
  this.queue.put(audio);
97
127
  }
98
128
  };
package/src/tts/tts.ts CHANGED
@@ -3,16 +3,21 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  import type { AudioFrame } from '@livekit/rtc-node';
5
5
  import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
6
+ import type { Span } from '@opentelemetry/api';
6
7
  import { EventEmitter } from 'node:events';
7
8
  import type { ReadableStream } from 'node:stream/web';
8
- import { APIConnectionError, APIStatusError } from '../_exceptions.js';
9
+ import { APIConnectionError, APIError } from '../_exceptions.js';
9
10
  import { log } from '../log.js';
10
11
  import type { TTSMetrics } from '../metrics/base.js';
11
12
  import { DeferredReadableStream } from '../stream/deferred_stream.js';
12
- import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';
13
+ import { recordException, traceTypes, tracer } from '../telemetry/index.js';
14
+ import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS, intervalForRetry } from '../types.js';
13
15
  import { AsyncIterableQueue, delay, mergeFrames, startSoon, toError } from '../utils.js';
16
+ import type { TimedString } from '../voice/io.js';
14
17
 
15
- /** SynthesizedAudio is a packet of speech synthesis as returned by the TTS. */
18
+ /**
19
+ * SynthesizedAudio is a packet of speech synthesis as returned by the TTS.
20
+ */
16
21
  export interface SynthesizedAudio {
17
22
  /** Request ID (one segment could be made up of multiple requests) */
18
23
  requestId: string;
@@ -24,6 +29,10 @@ export interface SynthesizedAudio {
24
29
  deltaText?: string;
25
30
  /** Whether this is the last frame of the segment (streaming only) */
26
31
  final: boolean;
32
+ /**
33
+ * Timed transcripts associated with this audio packet (word-level timestamps).
34
+ */
35
+ timedTranscripts?: TimedString[];
27
36
  }
28
37
 
29
38
  /**
@@ -35,6 +44,8 @@ export interface SynthesizedAudio {
35
44
  */
36
45
  export interface TTSCapabilities {
37
46
  streaming: boolean;
47
+ // Whether this TTS supports aligned transcripts (word-level timestamps).
48
+ alignedTranscript?: boolean;
38
49
  }
39
50
 
40
51
  export interface TTSError {
@@ -85,15 +96,49 @@ export abstract class TTS extends (EventEmitter as new () => TypedEmitter<TTSCal
85
96
  return this.#numChannels;
86
97
  }
87
98
 
99
+ /**
100
+ * Get the model name/identifier for this TTS instance.
101
+ *
102
+ * @returns The model name if available, "unknown" otherwise.
103
+ *
104
+ * @remarks
105
+ * Plugins should override this property to provide their model information.
106
+ */
107
+ get model(): string {
108
+ return 'unknown';
109
+ }
110
+
111
+ /**
112
+ * Get the provider name for this TTS instance.
113
+ *
114
+ * @returns The provider name if available, "unknown" otherwise.
115
+ *
116
+ * @remarks
117
+ * Plugins should override this property to provide their provider information.
118
+ */
119
+ get provider(): string {
120
+ return 'unknown';
121
+ }
122
+
88
123
  /**
89
124
  * Receives text and returns synthesis in the form of a {@link ChunkedStream}
90
125
  */
91
- abstract synthesize(text: string): ChunkedStream;
126
+ abstract synthesize(
127
+ text: string,
128
+ connOptions?: APIConnectOptions,
129
+ abortSignal?: AbortSignal,
130
+ ): ChunkedStream;
92
131
 
93
132
  /**
94
133
  * Returns a {@link SynthesizeStream} that can be used to push text and receive audio data
134
+ *
135
+ * @param options - Optional configuration including connection options
95
136
  */
96
- abstract stream(): SynthesizeStream;
137
+ abstract stream(options?: { connOptions?: APIConnectOptions }): SynthesizeStream;
138
+
139
+ async close(): Promise<void> {
140
+ return;
141
+ }
97
142
  }
98
143
 
99
144
  /**
@@ -123,12 +168,7 @@ export abstract class SynthesizeStream
123
168
  SynthesizedAudio | typeof SynthesizeStream.END_OF_STREAM
124
169
  >();
125
170
  protected closed = false;
126
- abstract label: string;
127
- #tts: TTS;
128
- #metricsPendingTexts: string[] = [];
129
- #metricsText = '';
130
- #monitorMetricsTask?: Promise<void>;
131
- private _connOptions: APIConnectOptions;
171
+ protected connOptions: APIConnectOptions;
132
172
  protected abortController = new AbortController();
133
173
 
134
174
  private deferredInputStream: DeferredReadableStream<
@@ -136,16 +176,27 @@ export abstract class SynthesizeStream
136
176
  >;
137
177
  private logger = log();
138
178
 
179
+ abstract label: string;
180
+
181
+ #tts: TTS;
182
+ #metricsPendingTexts: string[] = [];
183
+ #metricsText = '';
184
+ #monitorMetricsTask?: Promise<void>;
185
+ #ttsRequestSpan?: Span;
186
+ #inputTokens = 0;
187
+ #outputTokens = 0;
188
+
139
189
  constructor(tts: TTS, connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS) {
140
190
  this.#tts = tts;
141
- this._connOptions = connOptions;
191
+ this.connOptions = connOptions;
142
192
  this.deferredInputStream = new DeferredReadableStream();
143
193
  this.pumpInput();
194
+
144
195
  this.abortController.signal.addEventListener('abort', () => {
145
196
  this.deferredInputStream.detachSource();
146
197
  // TODO (AJS-36) clean this up when we refactor with streams
147
- this.input.close();
148
- this.output.close();
198
+ if (!this.input.closed) this.input.close();
199
+ if (!this.output.closed) this.output.close();
149
200
  this.closed = true;
150
201
  });
151
202
 
@@ -153,31 +204,49 @@ export abstract class SynthesizeStream
153
204
  // is run **after** the constructor has finished. Otherwise we get
154
205
  // runtime error when trying to access class variables in the
155
206
  // `run` method.
156
- startSoon(() => this.mainTask().then(() => this.queue.close()));
207
+ startSoon(() => this.mainTask().finally(() => this.queue.close()));
157
208
  }
158
209
 
159
- private async mainTask() {
160
- for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
210
+ private _mainTaskImpl = async (span: Span) => {
211
+ this.#ttsRequestSpan = span;
212
+ span.setAttributes({
213
+ [traceTypes.ATTR_TTS_STREAMING]: true,
214
+ [traceTypes.ATTR_TTS_LABEL]: this.#tts.label,
215
+ });
216
+
217
+ for (let i = 0; i < this.connOptions.maxRetry + 1; i++) {
161
218
  try {
162
- return await this.run();
219
+ return await tracer.startActiveSpan(
220
+ async (attemptSpan) => {
221
+ attemptSpan.setAttribute(traceTypes.ATTR_RETRY_COUNT, i);
222
+ try {
223
+ return await this.run();
224
+ } catch (error) {
225
+ recordException(attemptSpan, toError(error));
226
+ throw error;
227
+ }
228
+ },
229
+ { name: 'tts_request_run' },
230
+ );
163
231
  } catch (error) {
164
- if (error instanceof APIStatusError) {
165
- const retryInterval = this._connOptions._intervalForRetry(i);
232
+ if (error instanceof APIError) {
233
+ const retryInterval = intervalForRetry(this.connOptions, i);
166
234
 
167
- if (this._connOptions.maxRetry === 0 || !error.retryable) {
235
+ if (this.connOptions.maxRetry === 0 || !error.retryable) {
168
236
  this.emitError({ error, recoverable: false });
169
237
  throw error;
170
- } else if (i === this._connOptions.maxRetry) {
238
+ } else if (i === this.connOptions.maxRetry) {
171
239
  this.emitError({ error, recoverable: false });
172
240
  throw new APIConnectionError({
173
- message: `failed to generate TTS completion after ${this._connOptions.maxRetry + 1} attempts`,
241
+ message: `failed to generate TTS completion after ${this.connOptions.maxRetry + 1} attempts`,
174
242
  options: { retryable: false },
175
243
  });
176
244
  } else {
177
- this.emitError({ error, recoverable: true });
245
+ // Don't emit error event for recoverable errors during retry loop
246
+ // to avoid ERR_UNHANDLED_ERROR or premature session termination
178
247
  this.logger.warn(
179
248
  { tts: this.#tts.label, attempt: i + 1, error },
180
- `failed to synthesize speech, retrying in ${retryInterval}s`,
249
+ `failed to synthesize speech, retrying in ${retryInterval}ms`,
181
250
  );
182
251
  }
183
252
 
@@ -190,7 +259,13 @@ export abstract class SynthesizeStream
190
259
  }
191
260
  }
192
261
  }
193
- }
262
+ };
263
+
264
+ private mainTask = async () =>
265
+ tracer.startActiveSpan(async (span) => this._mainTaskImpl(span), {
266
+ name: 'tts_request',
267
+ endOnExit: false,
268
+ });
194
269
 
195
270
  private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
196
271
  this.#tts.emit('error', {
@@ -202,7 +277,16 @@ export abstract class SynthesizeStream
202
277
  });
203
278
  }
204
279
 
205
- // TODO(AJS-37) Remove when refactoring TTS to use streams
280
+ // NOTE(AJS-37): The implementation below uses an AsyncIterableQueue (`this.input`)
281
+ // bridged from a DeferredReadableStream (`this.deferredInputStream`) rather than
282
+ // consuming the stream directly.
283
+ //
284
+ // A full refactor to native Web Streams was considered but is currently deferred.
285
+ // The primary reason is to maintain architectural parity with the Python SDK,
286
+ // which is a key design goal for the project. This ensures a consistent developer
287
+ // experience across both platforms.
288
+ //
289
+ // For more context, see the discussion in GitHub issue # 844.
206
290
  protected async pumpInput() {
207
291
  const reader = this.deferredInputStream.stream.getReader();
208
292
  try {
@@ -226,9 +310,21 @@ export abstract class SynthesizeStream
226
310
  }
227
311
  }
228
312
 
313
+ /**
314
+ * Set token usage for token-based TTS billing (e.g., OpenAI TTS).
315
+ * Plugins should call this method to report token usage.
316
+ */
317
+ protected setTokenUsage({
318
+ inputTokens = 0,
319
+ outputTokens = 0,
320
+ }: { inputTokens?: number; outputTokens?: number } = {}): void {
321
+ this.#inputTokens = inputTokens;
322
+ this.#outputTokens = outputTokens;
323
+ }
324
+
229
325
  protected async monitorMetrics() {
230
326
  const startTime = process.hrtime.bigint();
231
- let audioDuration = 0;
327
+ let audioDurationMs = 0;
232
328
  let ttfb: bigint = BigInt(-1);
233
329
  let requestId = '';
234
330
 
@@ -236,19 +332,33 @@ export abstract class SynthesizeStream
236
332
  if (this.#metricsPendingTexts.length) {
237
333
  const text = this.#metricsPendingTexts.shift()!;
238
334
  const duration = process.hrtime.bigint() - startTime;
335
+ const roundedAudioDurationMs = Math.round(audioDurationMs);
239
336
  const metrics: TTSMetrics = {
240
337
  type: 'tts_metrics',
241
338
  timestamp: Date.now(),
242
339
  requestId,
243
- ttfb: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
244
- duration: Math.trunc(Number(duration / BigInt(1000000))),
340
+ ttfbMs: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
341
+ durationMs: Math.trunc(Number(duration / BigInt(1000000))),
245
342
  charactersCount: text.length,
246
- audioDuration,
343
+ audioDurationMs: roundedAudioDurationMs,
247
344
  cancelled: this.abortController.signal.aborted,
248
345
  label: this.#tts.label,
249
- streamed: false,
346
+ inputTokens: this.#inputTokens,
347
+ outputTokens: this.#outputTokens,
348
+ streamed: true,
349
+ metadata: {
350
+ modelProvider: this.#tts.provider,
351
+ modelName: this.#tts.model,
352
+ },
250
353
  };
354
+ if (this.#ttsRequestSpan) {
355
+ this.#ttsRequestSpan.setAttribute(traceTypes.ATTR_TTS_METRICS, JSON.stringify(metrics));
356
+ }
251
357
  this.#tts.emit('metrics_collected', metrics);
358
+
359
+ // Reset token usage after emitting metrics for the next segment
360
+ this.#inputTokens = 0;
361
+ this.#outputTokens = 0;
252
362
  }
253
363
  };
254
364
 
@@ -263,7 +373,7 @@ export abstract class SynthesizeStream
263
373
  ttfb = process.hrtime.bigint() - startTime;
264
374
  }
265
375
  // TODO(AJS-102): use frame.durationMs once available in rtc-node
266
- audioDuration += audio.frame.samplesPerChannel / audio.frame.sampleRate;
376
+ audioDurationMs += (audio.frame.samplesPerChannel / audio.frame.sampleRate) * 1000;
267
377
  if (audio.final) {
268
378
  emit();
269
379
  }
@@ -272,6 +382,11 @@ export abstract class SynthesizeStream
272
382
  if (requestId) {
273
383
  emit();
274
384
  }
385
+
386
+ if (this.#ttsRequestSpan) {
387
+ this.#ttsRequestSpan.end();
388
+ this.#ttsRequestSpan = undefined;
389
+ }
275
390
  }
276
391
 
277
392
  protected abstract run(): Promise<void>;
@@ -290,12 +405,11 @@ export abstract class SynthesizeStream
290
405
  }
291
406
  this.#metricsText += text;
292
407
 
293
- if (this.input.closed) {
294
- throw new Error('Input is closed');
295
- }
296
- if (this.closed) {
297
- throw new Error('Stream is closed');
408
+ if (this.input.closed || this.closed) {
409
+ // Stream was aborted/closed, silently skip
410
+ return;
298
411
  }
412
+
299
413
  this.input.put(text);
300
414
  }
301
415
 
@@ -305,24 +419,24 @@ export abstract class SynthesizeStream
305
419
  this.#metricsPendingTexts.push(this.#metricsText);
306
420
  this.#metricsText = '';
307
421
  }
308
- if (this.input.closed) {
309
- throw new Error('Input is closed');
310
- }
311
- if (this.closed) {
312
- throw new Error('Stream is closed');
422
+
423
+ if (this.input.closed || this.closed) {
424
+ // Stream was aborted/closed, silently skip
425
+ return;
313
426
  }
427
+
314
428
  this.input.put(SynthesizeStream.FLUSH_SENTINEL);
315
429
  }
316
430
 
317
431
  /** Mark the input as ended and forbid additional pushes */
318
432
  endInput() {
319
433
  this.flush();
320
- if (this.input.closed) {
321
- throw new Error('Input is closed');
322
- }
323
- if (this.closed) {
324
- throw new Error('Stream is closed');
434
+
435
+ if (this.input.closed || this.closed) {
436
+ // Stream was aborted/closed, silently skip
437
+ return;
325
438
  }
439
+
326
440
  this.input.close();
327
441
  }
328
442
 
@@ -330,6 +444,10 @@ export abstract class SynthesizeStream
330
444
  return this.output.next();
331
445
  }
332
446
 
447
+ get abortSignal(): AbortSignal {
448
+ return this.abortController.signal;
449
+ }
450
+
333
451
  /** Close both the input and output of the TTS stream */
334
452
  close() {
335
453
  this.abortController.abort();
@@ -361,34 +479,61 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
361
479
  abstract label: string;
362
480
  #text: string;
363
481
  #tts: TTS;
482
+ #ttsRequestSpan?: Span;
364
483
  private _connOptions: APIConnectOptions;
365
484
  private logger = log();
485
+ #inputTokens = 0;
486
+ #outputTokens = 0;
487
+
488
+ protected abortController = new AbortController();
366
489
 
367
490
  constructor(
368
491
  text: string,
369
492
  tts: TTS,
370
493
  connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS,
494
+ abortSignal?: AbortSignal,
371
495
  ) {
372
496
  this.#text = text;
373
497
  this.#tts = tts;
374
498
  this._connOptions = connOptions;
375
499
 
500
+ if (abortSignal) {
501
+ abortSignal.addEventListener('abort', () => this.abortController.abort(), { once: true });
502
+ }
503
+
376
504
  this.monitorMetrics();
377
505
 
378
506
  // this is a hack to immitate asyncio.create_task so that mainTask
379
507
  // is run **after** the constructor has finished. Otherwise we get
380
508
  // runtime error when trying to access class variables in the
381
509
  // `run` method.
382
- Promise.resolve().then(() => this.mainTask().then(() => this.queue.close()));
510
+ Promise.resolve().then(() => this.mainTask().finally(() => this.queue.close()));
383
511
  }
384
512
 
385
- private async mainTask() {
513
+ private _mainTaskImpl = async (span: Span) => {
514
+ this.#ttsRequestSpan = span;
515
+ span.setAttributes({
516
+ [traceTypes.ATTR_TTS_STREAMING]: false,
517
+ [traceTypes.ATTR_TTS_LABEL]: this.#tts.label,
518
+ });
519
+
386
520
  for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
387
521
  try {
388
- return await this.run();
522
+ return await tracer.startActiveSpan(
523
+ async (attemptSpan) => {
524
+ attemptSpan.setAttribute(traceTypes.ATTR_RETRY_COUNT, i);
525
+ try {
526
+ return await this.run();
527
+ } catch (error) {
528
+ recordException(attemptSpan, toError(error));
529
+ throw error;
530
+ }
531
+ },
532
+ { name: 'tts_request_run' },
533
+ );
389
534
  } catch (error) {
390
- if (error instanceof APIStatusError) {
391
- const retryInterval = this._connOptions._intervalForRetry(i);
535
+ if (error instanceof APIError) {
536
+ const retryInterval = intervalForRetry(this._connOptions, i);
392
537
 
393
538
  if (this._connOptions.maxRetry === 0 || !error.retryable) {
394
539
  this.emitError({ error, recoverable: false });
@@ -400,10 +545,11 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
400
545
  options: { retryable: false },
401
546
  });
402
547
  } else {
403
- this.emitError({ error, recoverable: true });
548
+ // Don't emit error event for recoverable errors during retry loop
549
+ // to avoid ERR_UNHANDLED_ERROR or premature session termination
404
550
  this.logger.warn(
405
551
  { tts: this.#tts.label, attempt: i + 1, error },
406
- `failed to generate TTS completion, retrying in ${retryInterval}s`,
552
+ `failed to generate TTS completion, retrying in ${retryInterval}ms`,
407
553
  );
408
554
  }
409
555
 
@@ -416,6 +562,13 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
416
562
  }
417
563
  }
418
564
  }
565
+ };
566
+
567
+ private async mainTask() {
568
+ return tracer.startActiveSpan(async (span) => this._mainTaskImpl(span), {
569
+ name: 'tts_request',
570
+ endOnExit: false,
571
+ });
419
572
  }
420
573
 
421
574
  private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
@@ -434,9 +587,25 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
434
587
  return this.#text;
435
588
  }
436
589
 
590
+ get abortSignal(): AbortSignal {
591
+ return this.abortController.signal;
592
+ }
593
+
594
+ /**
595
+ * Set token usage for token-based TTS billing (e.g., OpenAI TTS).
596
+ * Plugins should call this method to report token usage.
597
+ */
598
+ protected setTokenUsage({
599
+ inputTokens = 0,
600
+ outputTokens = 0,
601
+ }: { inputTokens?: number; outputTokens?: number } = {}): void {
602
+ this.#inputTokens = inputTokens;
603
+ this.#outputTokens = outputTokens;
604
+ }
605
+
437
606
  protected async monitorMetrics() {
438
607
  const startTime = process.hrtime.bigint();
439
- let audioDuration = 0;
608
+ let audioDurationMs = 0;
440
609
  let ttfb: bigint = BigInt(-1);
441
610
  let requestId = '';
442
611
 
@@ -446,7 +615,7 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
446
615
  if (ttfb === BigInt(-1)) {
447
616
  ttfb = process.hrtime.bigint() - startTime;
448
617
  }
449
- audioDuration += audio.frame.samplesPerChannel / audio.frame.sampleRate;
618
+ audioDurationMs += (audio.frame.samplesPerChannel / audio.frame.sampleRate) * 1000;
450
619
  }
451
620
  this.output.close();
452
621
 
@@ -455,14 +624,27 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
455
624
  type: 'tts_metrics',
456
625
  timestamp: Date.now(),
457
626
  requestId,
458
- ttfb: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
459
- duration: Math.trunc(Number(duration / BigInt(1000000))),
627
+ ttfbMs: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
628
+ durationMs: Math.trunc(Number(duration / BigInt(1000000))),
460
629
  charactersCount: this.#text.length,
461
- audioDuration,
630
+ audioDurationMs: Math.round(audioDurationMs),
462
631
  cancelled: false, // TODO(AJS-186): support ChunkedStream with 1.0 - add this.abortController.signal.aborted here
463
632
  label: this.#tts.label,
633
+ inputTokens: this.#inputTokens,
634
+ outputTokens: this.#outputTokens,
464
635
  streamed: false,
636
+ metadata: {
637
+ modelProvider: this.#tts.provider,
638
+ modelName: this.#tts.model,
639
+ },
465
640
  };
641
+
642
+ if (this.#ttsRequestSpan) {
643
+ this.#ttsRequestSpan.setAttribute(traceTypes.ATTR_TTS_METRICS, JSON.stringify(metrics));
644
+ this.#ttsRequestSpan.end();
645
+ this.#ttsRequestSpan = undefined;
646
+ }
647
+
466
648
  this.#tts.emit('metrics_collected', metrics);
467
649
  }
468
650
 
@@ -481,8 +663,9 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
481
663
 
482
664
  /** Close both the input and output of the TTS stream */
483
665
  close() {
484
- this.queue.close();
485
- this.output.close();
666
+ if (!this.queue.closed) this.queue.close();
667
+ if (!this.output.closed) this.output.close();
668
+ if (!this.abortController.signal.aborted) this.abortController.abort();
486
669
  this.closed = true;
487
670
  }
488
671