@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
@@ -0,0 +1,59 @@
1
+ import type { TypedEventEmitter } from '@livekit/typed-emitter';
2
+ import type { InterruptionMetrics } from '../../metrics/base.js';
3
+ import { InterruptionDetectionError } from './errors.js';
4
+ import { InterruptionStreamBase } from './interruption_stream.js';
5
+ import type { InterruptionOptions, OverlappingSpeechEvent } from './types.js';
6
+ type InterruptionCallbacks = {
7
+ overlapping_speech: (event: OverlappingSpeechEvent) => void;
8
+ metrics_collected: (metrics: InterruptionMetrics) => void;
9
+ error: (error: InterruptionDetectionError) => void;
10
+ };
11
+ export type AdaptiveInterruptionDetectorOptions = Omit<Partial<InterruptionOptions>, 'useProxy'>;
12
+ declare const AdaptiveInterruptionDetector_base: new () => TypedEventEmitter<InterruptionCallbacks>;
13
+ export declare class AdaptiveInterruptionDetector extends AdaptiveInterruptionDetector_base {
14
+ options: InterruptionOptions;
15
+ private readonly _label;
16
+ private logger;
17
+ private streams;
18
+ constructor(options?: AdaptiveInterruptionDetectorOptions);
19
+ /**
20
+ * The model identifier for this detector.
21
+ */
22
+ get model(): string;
23
+ /**
24
+ * The provider identifier for this detector.
25
+ */
26
+ get provider(): string;
27
+ /**
28
+ * The label for this detector instance.
29
+ */
30
+ get label(): string;
31
+ /**
32
+ * The sample rate used for audio processing.
33
+ */
34
+ get sampleRate(): number;
35
+ /**
36
+ * Emit an error event from the detector.
37
+ */
38
+ emitError(error: InterruptionDetectionError): void;
39
+ /**
40
+ * Creates a new InterruptionStreamBase for internal use.
41
+ * The stream can receive audio frames and sentinels via pushFrame().
42
+ * Use this when you need direct access to the stream for pushing frames.
43
+ */
44
+ createStream(): InterruptionStreamBase;
45
+ /**
46
+ * Remove a stream from tracking (called when stream is closed).
47
+ */
48
+ removeStream(stream: InterruptionStreamBase): void;
49
+ /**
50
+ * Update options for the detector and propagate to all active streams.
51
+ * For WebSocket streams, this triggers a reconnection with new settings.
52
+ */
53
+ updateOptions(options: {
54
+ threshold?: number;
55
+ minInterruptionDurationInS?: number;
56
+ }): Promise<void>;
57
+ }
58
+ export {};
59
+ //# sourceMappingURL=interruption_detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interruption_detector.d.ts","sourceRoot":"","sources":["../../../src/inference/interruption/interruption_detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE9E,KAAK,qBAAqB,GAAG;IAC3B,kBAAkB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC5D,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC1D,KAAK,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,UAAU,CAAC,CAAC;2DAEpB,kBAAkB,qBAAqB,CAAC;AAArH,qBAAa,4BAA6B,SAAQ,iCAAoE;IACpH,OAAO,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,OAAO,CAA0C;gBAE7C,OAAO,GAAE,mCAAwC;IA6F7D;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,0BAA0B,GAAG,IAAI;IAIlD;;;;OAIG;IACH,YAAY,IAAI,sBAAsB;IAYtC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAIlD;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,0BAA0B,CAAC,EAAE,MAAM,CAAC;KACrC,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBlB"}
@@ -0,0 +1,164 @@
1
+ import EventEmitter from "events";
2
+ import { log } from "../../log.js";
3
+ import { DEFAULT_INFERENCE_URL, STAGING_INFERENCE_URL, getDefaultInferenceUrl } from "../utils.js";
4
+ import { FRAMES_PER_SECOND, SAMPLE_RATE, interruptionOptionDefaults } from "./defaults.js";
5
+ import { InterruptionDetectionError } from "./errors.js";
6
+ import { InterruptionStreamBase } from "./interruption_stream.js";
7
+ class AdaptiveInterruptionDetector extends EventEmitter {
8
+ options;
9
+ _label;
10
+ logger = log();
11
+ // Use Set instead of WeakSet to allow iteration for propagating option updates
12
+ streams = /* @__PURE__ */ new Set();
13
+ constructor(options = {}) {
14
+ super();
15
+ const {
16
+ maxAudioDurationInS,
17
+ baseUrl,
18
+ apiKey,
19
+ apiSecret,
20
+ audioPrefixDurationInS,
21
+ threshold,
22
+ detectionIntervalInS,
23
+ inferenceTimeout,
24
+ minInterruptionDurationInS
25
+ } = { ...interruptionOptionDefaults, ...options };
26
+ if (maxAudioDurationInS > 3) {
27
+ throw new RangeError("maxAudioDurationInS must be less than or equal to 3.0 seconds");
28
+ }
29
+ const lkBaseUrl = baseUrl ?? process.env.LIVEKIT_REMOTE_EOT_URL ?? getDefaultInferenceUrl();
30
+ let lkApiKey = apiKey ?? "";
31
+ let lkApiSecret = apiSecret ?? "";
32
+ let useProxy;
33
+ const isInferenceUrl = lkBaseUrl === DEFAULT_INFERENCE_URL || lkBaseUrl === STAGING_INFERENCE_URL;
34
+ if (isInferenceUrl) {
35
+ lkApiKey = apiKey ?? process.env.LIVEKIT_INFERENCE_API_KEY ?? process.env.LIVEKIT_API_KEY ?? "";
36
+ if (!lkApiKey) {
37
+ throw new TypeError(
38
+ "apiKey is required, either as argument or set LIVEKIT_API_KEY environmental variable"
39
+ );
40
+ }
41
+ lkApiSecret = apiSecret ?? process.env.LIVEKIT_INFERENCE_API_SECRET ?? process.env.LIVEKIT_API_SECRET ?? "";
42
+ if (!lkApiSecret) {
43
+ throw new TypeError(
44
+ "apiSecret is required, either as argument or set LIVEKIT_API_SECRET environmental variable"
45
+ );
46
+ }
47
+ useProxy = true;
48
+ } else {
49
+ useProxy = false;
50
+ }
51
+ const transport = useProxy ? "websocket" : "http";
52
+ this.logger.debug(
53
+ {
54
+ baseUrl: lkBaseUrl,
55
+ useProxy,
56
+ transport
57
+ },
58
+ "=== Resolved interruption detector transport configuration"
59
+ );
60
+ this.options = {
61
+ sampleRate: SAMPLE_RATE,
62
+ threshold,
63
+ minFrames: Math.ceil(minInterruptionDurationInS * FRAMES_PER_SECOND),
64
+ maxAudioDurationInS,
65
+ audioPrefixDurationInS,
66
+ detectionIntervalInS,
67
+ inferenceTimeout,
68
+ baseUrl: lkBaseUrl,
69
+ apiKey: lkApiKey,
70
+ apiSecret: lkApiSecret,
71
+ useProxy,
72
+ minInterruptionDurationInS
73
+ };
74
+ this._label = `${this.constructor.name}`;
75
+ this.logger.debug(
76
+ {
77
+ baseUrl: this.options.baseUrl,
78
+ detectionIntervalInS: this.options.detectionIntervalInS,
79
+ audioPrefixDurationInS: this.options.audioPrefixDurationInS,
80
+ maxAudioDurationInS: this.options.maxAudioDurationInS,
81
+ minFrames: this.options.minFrames,
82
+ threshold: this.options.threshold,
83
+ inferenceTimeout: this.options.inferenceTimeout,
84
+ useProxy: this.options.useProxy,
85
+ transport
86
+ },
87
+ "=== Adaptive interruption detector initialized"
88
+ );
89
+ }
90
+ /**
91
+ * The model identifier for this detector.
92
+ */
93
+ get model() {
94
+ return "adaptive interruption";
95
+ }
96
+ /**
97
+ * The provider identifier for this detector.
98
+ */
99
+ get provider() {
100
+ return "livekit";
101
+ }
102
+ /**
103
+ * The label for this detector instance.
104
+ */
105
+ get label() {
106
+ return this._label;
107
+ }
108
+ /**
109
+ * The sample rate used for audio processing.
110
+ */
111
+ get sampleRate() {
112
+ return this.options.sampleRate;
113
+ }
114
+ /**
115
+ * Emit an error event from the detector.
116
+ */
117
+ emitError(error) {
118
+ this.emit("error", error);
119
+ }
120
+ /**
121
+ * Creates a new InterruptionStreamBase for internal use.
122
+ * The stream can receive audio frames and sentinels via pushFrame().
123
+ * Use this when you need direct access to the stream for pushing frames.
124
+ */
125
+ createStream() {
126
+ try {
127
+ const streamBase = new InterruptionStreamBase(this, {});
128
+ this.streams.add(streamBase);
129
+ return streamBase;
130
+ } catch (e) {
131
+ const cause = e instanceof Error ? e : new Error(String(e));
132
+ this.emitError(new InterruptionDetectionError(cause.message, Date.now(), this._label, false));
133
+ throw e;
134
+ }
135
+ }
136
+ /**
137
+ * Remove a stream from tracking (called when stream is closed).
138
+ */
139
+ removeStream(stream) {
140
+ this.streams.delete(stream);
141
+ }
142
+ /**
143
+ * Update options for the detector and propagate to all active streams.
144
+ * For WebSocket streams, this triggers a reconnection with new settings.
145
+ */
146
+ async updateOptions(options) {
147
+ if (options.threshold !== void 0) {
148
+ this.options.threshold = options.threshold;
149
+ }
150
+ if (options.minInterruptionDurationInS !== void 0) {
151
+ this.options.minInterruptionDurationInS = options.minInterruptionDurationInS;
152
+ this.options.minFrames = Math.ceil(options.minInterruptionDurationInS * FRAMES_PER_SECOND);
153
+ }
154
+ const updatePromises = [];
155
+ for (const stream of this.streams) {
156
+ updatePromises.push(stream.updateOptions(options));
157
+ }
158
+ await Promise.all(updatePromises);
159
+ }
160
+ }
161
+ export {
162
+ AdaptiveInterruptionDetector
163
+ };
164
+ //# sourceMappingURL=interruption_detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/interruption_detector.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TypedEventEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport { log } from '../../log.js';\nimport type { InterruptionMetrics } from '../../metrics/base.js';\nimport { DEFAULT_INFERENCE_URL, STAGING_INFERENCE_URL, getDefaultInferenceUrl } from '../utils.js';\nimport { FRAMES_PER_SECOND, SAMPLE_RATE, interruptionOptionDefaults } from './defaults.js';\nimport { InterruptionDetectionError } from './errors.js';\nimport { InterruptionStreamBase } from './interruption_stream.js';\nimport type { InterruptionOptions, OverlappingSpeechEvent } from './types.js';\n\ntype InterruptionCallbacks = {\n overlapping_speech: (event: OverlappingSpeechEvent) => void;\n metrics_collected: (metrics: InterruptionMetrics) => void;\n error: (error: InterruptionDetectionError) => void;\n};\n\nexport type AdaptiveInterruptionDetectorOptions = Omit<Partial<InterruptionOptions>, 'useProxy'>;\n\nexport class AdaptiveInterruptionDetector extends (EventEmitter as new () => TypedEventEmitter<InterruptionCallbacks>) {\n options: InterruptionOptions;\n private readonly _label: string;\n private logger = log();\n // Use Set instead of WeakSet to allow iteration for propagating option updates\n private streams: Set<InterruptionStreamBase> = new Set();\n\n constructor(options: AdaptiveInterruptionDetectorOptions = {}) {\n super();\n\n const {\n maxAudioDurationInS,\n baseUrl,\n apiKey,\n apiSecret,\n audioPrefixDurationInS,\n threshold,\n detectionIntervalInS,\n inferenceTimeout,\n minInterruptionDurationInS,\n } = { ...interruptionOptionDefaults, ...options };\n\n if (maxAudioDurationInS > 3.0) {\n throw new RangeError('maxAudioDurationInS must be less than or equal to 3.0 seconds');\n }\n\n const lkBaseUrl = baseUrl ?? process.env.LIVEKIT_REMOTE_EOT_URL ?? getDefaultInferenceUrl();\n let lkApiKey = apiKey ?? '';\n let lkApiSecret = apiSecret ?? '';\n let useProxy: boolean;\n\n // Use LiveKit credentials if using the inference service (production or staging)\n const isInferenceUrl =\n lkBaseUrl === DEFAULT_INFERENCE_URL || lkBaseUrl === STAGING_INFERENCE_URL;\n if (isInferenceUrl) {\n lkApiKey =\n apiKey ?? process.env.LIVEKIT_INFERENCE_API_KEY ?? process.env.LIVEKIT_API_KEY ?? '';\n if (!lkApiKey) {\n throw new TypeError(\n 'apiKey is required, either as argument or set LIVEKIT_API_KEY environmental variable',\n );\n }\n\n lkApiSecret =\n apiSecret ??\n process.env.LIVEKIT_INFERENCE_API_SECRET ??\n process.env.LIVEKIT_API_SECRET ??\n '';\n if (!lkApiSecret) {\n throw new TypeError(\n 'apiSecret is required, either as argument or set LIVEKIT_API_SECRET environmental variable',\n );\n }\n useProxy = true;\n } else {\n useProxy = false;\n }\n const transport = useProxy ? 'websocket' : 'http';\n this.logger.debug(\n {\n baseUrl: lkBaseUrl,\n useProxy,\n transport,\n },\n '=== Resolved interruption detector transport configuration',\n );\n\n this.options = {\n sampleRate: SAMPLE_RATE,\n threshold,\n minFrames: Math.ceil(minInterruptionDurationInS * FRAMES_PER_SECOND),\n maxAudioDurationInS,\n audioPrefixDurationInS,\n detectionIntervalInS,\n inferenceTimeout,\n baseUrl: lkBaseUrl,\n apiKey: lkApiKey,\n apiSecret: lkApiSecret,\n useProxy,\n minInterruptionDurationInS,\n };\n\n this._label = `${this.constructor.name}`;\n\n this.logger.debug(\n {\n baseUrl: this.options.baseUrl,\n detectionIntervalInS: this.options.detectionIntervalInS,\n audioPrefixDurationInS: this.options.audioPrefixDurationInS,\n maxAudioDurationInS: this.options.maxAudioDurationInS,\n minFrames: this.options.minFrames,\n threshold: this.options.threshold,\n inferenceTimeout: this.options.inferenceTimeout,\n useProxy: this.options.useProxy,\n transport,\n },\n '=== Adaptive interruption detector initialized',\n );\n }\n\n /**\n * The model identifier for this detector.\n */\n get model(): string {\n return 'adaptive interruption';\n }\n\n /**\n * The provider identifier for this detector.\n */\n get provider(): string {\n return 'livekit';\n }\n\n /**\n * The label for this detector instance.\n */\n get label(): string {\n return this._label;\n }\n\n /**\n * The sample rate used for audio processing.\n */\n get sampleRate(): number {\n return this.options.sampleRate;\n }\n\n /**\n * Emit an error event from the detector.\n */\n emitError(error: InterruptionDetectionError): void {\n this.emit('error', error);\n }\n\n /**\n * Creates a new InterruptionStreamBase for internal use.\n * The stream can receive audio frames and sentinels via pushFrame().\n * Use this when you need direct access to the stream for pushing frames.\n */\n createStream(): InterruptionStreamBase {\n try {\n const streamBase = new InterruptionStreamBase(this, {});\n this.streams.add(streamBase);\n return streamBase;\n } catch (e) {\n const cause = e instanceof Error ? e : new Error(String(e));\n this.emitError(new InterruptionDetectionError(cause.message, Date.now(), this._label, false));\n throw e;\n }\n }\n\n /**\n * Remove a stream from tracking (called when stream is closed).\n */\n removeStream(stream: InterruptionStreamBase): void {\n this.streams.delete(stream);\n }\n\n /**\n * Update options for the detector and propagate to all active streams.\n * For WebSocket streams, this triggers a reconnection with new settings.\n */\n async updateOptions(options: {\n threshold?: number;\n minInterruptionDurationInS?: number;\n }): Promise<void> {\n if (options.threshold !== undefined) {\n this.options.threshold = options.threshold;\n }\n if (options.minInterruptionDurationInS !== undefined) {\n this.options.minInterruptionDurationInS = options.minInterruptionDurationInS;\n this.options.minFrames = Math.ceil(options.minInterruptionDurationInS * FRAMES_PER_SECOND);\n }\n\n // Propagate option updates to all active streams (matching Python behavior)\n const updatePromises: Promise<void>[] = [];\n for (const stream of this.streams) {\n updatePromises.push(stream.updateOptions(options));\n }\n await Promise.all(updatePromises);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var interruption_stream_exports = {};
20
+ __export(interruption_stream_exports, {
21
+ InterruptionStreamBase: () => InterruptionStreamBase,
22
+ InterruptionStreamSentinel: () => InterruptionStreamSentinel
23
+ });
24
+ module.exports = __toCommonJS(interruption_stream_exports);
25
+ var import_rtc_node = require("@livekit/rtc-node");
26
+ var import_web = require("stream/web");
27
+ var import_log = require("../../log.cjs");
28
+ var import_stream_channel = require("../../stream/stream_channel.cjs");
29
+ var import_telemetry = require("../../telemetry/index.cjs");
30
+ var import_defaults = require("./defaults.cjs");
31
+ var import_http_transport = require("./http_transport.cjs");
32
+ var import_interruption_cache_entry = require("./interruption_cache_entry.cjs");
33
+ var import_types = require("./types.cjs");
34
+ var import_utils = require("./utils.cjs");
35
+ var import_ws_transport = require("./ws_transport.cjs");
36
+ class InterruptionStreamSentinel {
37
+ static agentSpeechStarted() {
38
+ return { type: "agent-speech-started" };
39
+ }
40
+ static agentSpeechEnded() {
41
+ return { type: "agent-speech-ended" };
42
+ }
43
+ static overlapSpeechStarted(speechDuration, startedAt, userSpeakingSpan) {
44
+ return { type: "overlap-speech-started", speechDuration, startedAt, userSpeakingSpan };
45
+ }
46
+ static overlapSpeechEnded(endedAt) {
47
+ return { type: "overlap-speech-ended", endedAt };
48
+ }
49
+ static flush() {
50
+ return { type: "flush" };
51
+ }
52
+ }
53
+ function updateUserSpeakingSpan(span, entry) {
54
+ span.setAttribute(
55
+ import_telemetry.traceTypes.ATTR_IS_INTERRUPTION,
56
+ (entry.isInterruption ?? false).toString().toLowerCase()
57
+ );
58
+ span.setAttribute(import_telemetry.traceTypes.ATTR_INTERRUPTION_PROBABILITY, entry.probability);
59
+ span.setAttribute(import_telemetry.traceTypes.ATTR_INTERRUPTION_TOTAL_DURATION, entry.totalDurationInS);
60
+ span.setAttribute(import_telemetry.traceTypes.ATTR_INTERRUPTION_PREDICTION_DURATION, entry.predictionDurationInS);
61
+ span.setAttribute(import_telemetry.traceTypes.ATTR_INTERRUPTION_DETECTION_DELAY, entry.detectionDelayInS);
62
+ }
63
+ class InterruptionStreamBase {
64
+ inputStream;
65
+ eventStream;
66
+ resampler;
67
+ numRequests = 0;
68
+ userSpeakingSpan;
69
+ overlapSpeechStartedAt;
70
+ options;
71
+ apiOptions;
72
+ model;
73
+ logger = (0, import_log.log)();
74
+ // Store reconnect function for WebSocket transport
75
+ wsReconnect;
76
+ // Mutable transport options that can be updated via updateOptions()
77
+ transportOptions;
78
+ constructor(model, apiOptions) {
79
+ this.inputStream = (0, import_stream_channel.createStreamChannel)();
80
+ this.model = model;
81
+ this.options = { ...model.options };
82
+ this.apiOptions = { ...import_defaults.apiConnectDefaults, ...apiOptions };
83
+ this.transportOptions = {
84
+ baseUrl: this.options.baseUrl,
85
+ apiKey: this.options.apiKey,
86
+ apiSecret: this.options.apiSecret,
87
+ sampleRate: this.options.sampleRate,
88
+ threshold: this.options.threshold,
89
+ minFrames: this.options.minFrames,
90
+ timeout: this.options.inferenceTimeout,
91
+ maxRetries: this.apiOptions.maxRetries
92
+ };
93
+ this.eventStream = this.setupTransform();
94
+ }
95
+ /**
96
+ * Update stream options. For WebSocket transport, this triggers a reconnection.
97
+ */
98
+ async updateOptions(options) {
99
+ if (options.threshold !== void 0) {
100
+ this.options.threshold = options.threshold;
101
+ this.transportOptions.threshold = options.threshold;
102
+ }
103
+ if (options.minInterruptionDurationInS !== void 0) {
104
+ this.options.minInterruptionDurationInS = options.minInterruptionDurationInS;
105
+ this.options.minFrames = Math.ceil(options.minInterruptionDurationInS * import_defaults.FRAMES_PER_SECOND);
106
+ this.transportOptions.minFrames = this.options.minFrames;
107
+ }
108
+ if (this.options.useProxy && this.wsReconnect) {
109
+ await this.wsReconnect();
110
+ }
111
+ }
112
+ setupTransform() {
113
+ let agentSpeechStarted = false;
114
+ let startIdx = 0;
115
+ let accumulatedSamples = 0;
116
+ let overlapSpeechStarted = false;
117
+ let overlapCount = 0;
118
+ const cache = new import_utils.BoundedCache(10);
119
+ const inferenceS16Data = new Int16Array(
120
+ Math.ceil(this.options.maxAudioDurationInS * this.options.sampleRate)
121
+ ).fill(0);
122
+ const getState = () => ({
123
+ overlapSpeechStarted,
124
+ overlapSpeechStartedAt: this.overlapSpeechStartedAt,
125
+ cache,
126
+ overlapCount
127
+ });
128
+ const setState = (partial) => {
129
+ if (partial.overlapSpeechStarted !== void 0) {
130
+ overlapSpeechStarted = partial.overlapSpeechStarted;
131
+ }
132
+ };
133
+ const handleSpanUpdate = (entry) => {
134
+ if (this.userSpeakingSpan) {
135
+ updateUserSpeakingSpan(this.userSpeakingSpan, entry);
136
+ this.userSpeakingSpan = void 0;
137
+ }
138
+ };
139
+ const onRequestSent = () => {
140
+ this.numRequests++;
141
+ };
142
+ const getAndResetNumRequests = () => {
143
+ const n = this.numRequests;
144
+ this.numRequests = 0;
145
+ return n;
146
+ };
147
+ const audioTransformer = new import_web.TransformStream(
148
+ {
149
+ transform: (chunk, controller) => {
150
+ if (chunk instanceof import_rtc_node.AudioFrame) {
151
+ if (!agentSpeechStarted) {
152
+ return;
153
+ }
154
+ if (this.options.sampleRate !== chunk.sampleRate) {
155
+ controller.error("the sample rate of the input frames must be consistent");
156
+ this.logger.error("the sample rate of the input frames must be consistent");
157
+ return;
158
+ }
159
+ const result = writeToInferenceS16Data(
160
+ chunk,
161
+ startIdx,
162
+ inferenceS16Data,
163
+ this.options.maxAudioDurationInS
164
+ );
165
+ startIdx = result.startIdx;
166
+ accumulatedSamples += result.samplesWritten;
167
+ if (accumulatedSamples >= Math.floor(this.options.detectionIntervalInS * this.options.sampleRate) && overlapSpeechStarted) {
168
+ const audioSlice = inferenceS16Data.slice(0, startIdx);
169
+ accumulatedSamples = 0;
170
+ controller.enqueue(audioSlice);
171
+ }
172
+ } else if (chunk.type === "agent-speech-started") {
173
+ this.logger.debug("agent speech started");
174
+ agentSpeechStarted = true;
175
+ overlapSpeechStarted = false;
176
+ this.overlapSpeechStartedAt = void 0;
177
+ accumulatedSamples = 0;
178
+ overlapCount = 0;
179
+ startIdx = 0;
180
+ this.numRequests = 0;
181
+ cache.clear();
182
+ } else if (chunk.type === "agent-speech-ended") {
183
+ this.logger.debug("agent speech ended");
184
+ agentSpeechStarted = false;
185
+ overlapSpeechStarted = false;
186
+ this.overlapSpeechStartedAt = void 0;
187
+ accumulatedSamples = 0;
188
+ overlapCount = 0;
189
+ startIdx = 0;
190
+ this.numRequests = 0;
191
+ cache.clear();
192
+ } else if (chunk.type === "overlap-speech-started" && agentSpeechStarted) {
193
+ this.overlapSpeechStartedAt = chunk.startedAt;
194
+ this.userSpeakingSpan = chunk.userSpeakingSpan;
195
+ this.logger.debug("overlap speech started, starting interruption inference");
196
+ overlapSpeechStarted = true;
197
+ accumulatedSamples = 0;
198
+ overlapCount += 1;
199
+ if (overlapCount <= 1) {
200
+ const keepSize = Math.round(chunk.speechDuration / 1e3 * this.options.sampleRate) + Math.round(this.options.audioPrefixDurationInS * this.options.sampleRate);
201
+ const shiftCount = Math.max(0, startIdx - keepSize);
202
+ inferenceS16Data.copyWithin(0, shiftCount, startIdx);
203
+ startIdx -= shiftCount;
204
+ }
205
+ cache.clear();
206
+ } else if (chunk.type === "overlap-speech-ended") {
207
+ this.logger.debug("overlap speech ended");
208
+ if (overlapSpeechStarted) {
209
+ this.userSpeakingSpan = void 0;
210
+ let latestEntry = cache.pop(
211
+ (entry) => entry.totalDurationInS !== void 0 && entry.totalDurationInS > 0
212
+ );
213
+ if (!latestEntry) {
214
+ this.logger.debug("no request made for overlap speech");
215
+ latestEntry = import_interruption_cache_entry.InterruptionCacheEntry.default();
216
+ }
217
+ const e = latestEntry ?? import_interruption_cache_entry.InterruptionCacheEntry.default();
218
+ const event = {
219
+ type: "overlapping_speech",
220
+ detectedAt: chunk.endedAt,
221
+ isInterruption: false,
222
+ overlapStartedAt: this.overlapSpeechStartedAt,
223
+ speechInput: e.speechInput,
224
+ probabilities: e.probabilities,
225
+ totalDurationInS: e.totalDurationInS,
226
+ detectionDelayInS: e.detectionDelayInS,
227
+ predictionDurationInS: e.predictionDurationInS,
228
+ probability: e.probability,
229
+ numRequests: getAndResetNumRequests()
230
+ };
231
+ controller.enqueue(event);
232
+ overlapSpeechStarted = false;
233
+ accumulatedSamples = 0;
234
+ }
235
+ this.overlapSpeechStartedAt = void 0;
236
+ } else if (chunk.type === "flush") {
237
+ }
238
+ }
239
+ },
240
+ { highWaterMark: 32 },
241
+ { highWaterMark: 32 }
242
+ );
243
+ const transportOptions = this.transportOptions;
244
+ let transport;
245
+ if (this.options.useProxy) {
246
+ const wsResult = (0, import_ws_transport.createWsTransport)(
247
+ transportOptions,
248
+ getState,
249
+ setState,
250
+ handleSpanUpdate,
251
+ onRequestSent,
252
+ getAndResetNumRequests
253
+ );
254
+ transport = wsResult.transport;
255
+ this.wsReconnect = wsResult.reconnect;
256
+ } else {
257
+ transport = (0, import_http_transport.createHttpTransport)(
258
+ transportOptions,
259
+ getState,
260
+ setState,
261
+ handleSpanUpdate,
262
+ getAndResetNumRequests
263
+ );
264
+ }
265
+ const eventEmitter = new import_web.TransformStream({
266
+ transform: (chunk, controller) => {
267
+ this.model.emit("overlapping_speech", chunk);
268
+ const metrics = {
269
+ type: "interruption_metrics",
270
+ timestamp: chunk.detectedAt,
271
+ totalDuration: chunk.totalDurationInS * 1e3,
272
+ predictionDuration: chunk.predictionDurationInS * 1e3,
273
+ detectionDelay: chunk.detectionDelayInS * 1e3,
274
+ numInterruptions: chunk.isInterruption ? 1 : 0,
275
+ numBackchannels: chunk.isInterruption ? 0 : 1,
276
+ numRequests: chunk.numRequests,
277
+ metadata: {
278
+ modelProvider: this.model.provider,
279
+ modelName: this.model.model
280
+ }
281
+ };
282
+ this.model.emit("metrics_collected", metrics);
283
+ controller.enqueue(chunk);
284
+ }
285
+ });
286
+ return this.inputStream.stream().pipeThrough(audioTransformer).pipeThrough(transport).pipeThrough(eventEmitter);
287
+ }
288
+ ensureInputNotEnded() {
289
+ if (this.inputStream.closed) {
290
+ throw new Error("input stream is closed");
291
+ }
292
+ }
293
+ ensureStreamsNotEnded() {
294
+ this.ensureInputNotEnded();
295
+ }
296
+ getResamplerFor(inputSampleRate) {
297
+ if (!this.resampler) {
298
+ this.resampler = new import_rtc_node.AudioResampler(inputSampleRate, this.options.sampleRate);
299
+ }
300
+ return this.resampler;
301
+ }
302
+ stream() {
303
+ return this.eventStream;
304
+ }
305
+ async pushFrame(frame) {
306
+ this.ensureStreamsNotEnded();
307
+ if (!(frame instanceof import_rtc_node.AudioFrame)) {
308
+ return this.inputStream.write(frame);
309
+ } else if (this.options.sampleRate !== frame.sampleRate) {
310
+ const resampler = this.getResamplerFor(frame.sampleRate);
311
+ if (resampler.inputRate !== frame.sampleRate) {
312
+ throw new Error("the sample rate of the input frames must be consistent");
313
+ }
314
+ for (const resampledFrame of resampler.push(frame)) {
315
+ await this.inputStream.write(resampledFrame);
316
+ }
317
+ } else {
318
+ await this.inputStream.write(frame);
319
+ }
320
+ }
321
+ async flush() {
322
+ this.ensureStreamsNotEnded();
323
+ await this.inputStream.write(InterruptionStreamSentinel.flush());
324
+ }
325
+ async endInput() {
326
+ await this.flush();
327
+ await this.inputStream.close();
328
+ }
329
+ async close() {
330
+ if (!this.inputStream.closed) await this.inputStream.close();
331
+ this.model.removeStream(this);
332
+ }
333
+ }
334
+ function writeToInferenceS16Data(frame, startIdx, outData, maxAudioDuration) {
335
+ const maxWindowSize = Math.floor(maxAudioDuration * frame.sampleRate);
336
+ if (frame.samplesPerChannel > outData.length) {
337
+ throw new Error("frame samples are greater than the max window size");
338
+ }
339
+ const shift = startIdx + frame.samplesPerChannel - maxWindowSize;
340
+ if (shift > 0) {
341
+ outData.copyWithin(0, shift, startIdx);
342
+ startIdx -= shift;
343
+ }
344
+ const frameData = new Int16Array(
345
+ frame.data.buffer,
346
+ frame.data.byteOffset,
347
+ frame.samplesPerChannel * frame.channels
348
+ );
349
+ if (frame.channels > 1) {
350
+ for (let i = 0; i < frame.samplesPerChannel; i++) {
351
+ let sum = 0;
352
+ for (let ch = 0; ch < frame.channels; ch++) {
353
+ sum += frameData[i * frame.channels + ch] ?? 0;
354
+ }
355
+ outData[startIdx + i] = Math.floor(sum / frame.channels);
356
+ }
357
+ } else {
358
+ outData.set(frameData, startIdx);
359
+ }
360
+ startIdx += frame.samplesPerChannel;
361
+ return { startIdx, samplesWritten: frame.samplesPerChannel };
362
+ }
363
+ // Annotate the CommonJS export names for ESM import in node:
364
+ 0 && (module.exports = {
365
+ InterruptionStreamBase,
366
+ InterruptionStreamSentinel
367
+ });
368
+ //# sourceMappingURL=interruption_stream.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/interruption_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { AudioFrame, AudioResampler } from '@livekit/rtc-node';\nimport type { Span } from '@opentelemetry/api';\nimport { type ReadableStream, TransformStream } from 'stream/web';\nimport { log } from '../../log.js';\nimport type { InterruptionMetrics } from '../../metrics/base.js';\nimport { type StreamChannel, createStreamChannel } from '../../stream/stream_channel.js';\nimport { traceTypes } from '../../telemetry/index.js';\nimport { FRAMES_PER_SECOND, apiConnectDefaults } from './defaults.js';\nimport type { InterruptionDetectionError } from './errors.js';\nimport { createHttpTransport } from './http_transport.js';\nimport { InterruptionCacheEntry } from './interruption_cache_entry.js';\nimport type { AdaptiveInterruptionDetector } from './interruption_detector.js';\nimport {\n type AgentSpeechEnded,\n type AgentSpeechStarted,\n type ApiConnectOptions,\n type Flush,\n type InterruptionOptions,\n type InterruptionSentinel,\n type OverlapSpeechEnded,\n type OverlapSpeechStarted,\n type OverlappingSpeechEvent,\n} from './types.js';\nimport { BoundedCache } from './utils.js';\nimport { createWsTransport } from './ws_transport.js';\n\n// Re-export sentinel types for backwards compatibility\nexport type {\n AgentSpeechEnded,\n AgentSpeechStarted,\n ApiConnectOptions,\n Flush,\n InterruptionSentinel,\n OverlapSpeechEnded,\n OverlapSpeechStarted,\n};\n\nexport class InterruptionStreamSentinel {\n static agentSpeechStarted(): AgentSpeechStarted {\n return { type: 'agent-speech-started' };\n }\n\n static agentSpeechEnded(): AgentSpeechEnded {\n return { type: 'agent-speech-ended' };\n }\n\n static overlapSpeechStarted(\n speechDuration: number,\n startedAt: number,\n userSpeakingSpan?: Span,\n ): OverlapSpeechStarted {\n return { type: 'overlap-speech-started', speechDuration, startedAt, userSpeakingSpan };\n }\n\n static overlapSpeechEnded(endedAt: number): OverlapSpeechEnded {\n return { type: 'overlap-speech-ended', endedAt };\n }\n\n static flush(): Flush {\n return { type: 'flush' };\n }\n}\n\nfunction updateUserSpeakingSpan(span: Span, entry: InterruptionCacheEntry) {\n span.setAttribute(\n traceTypes.ATTR_IS_INTERRUPTION,\n (entry.isInterruption ?? false).toString().toLowerCase(),\n );\n span.setAttribute(traceTypes.ATTR_INTERRUPTION_PROBABILITY, entry.probability);\n span.setAttribute(traceTypes.ATTR_INTERRUPTION_TOTAL_DURATION, entry.totalDurationInS);\n span.setAttribute(traceTypes.ATTR_INTERRUPTION_PREDICTION_DURATION, entry.predictionDurationInS);\n span.setAttribute(traceTypes.ATTR_INTERRUPTION_DETECTION_DELAY, entry.detectionDelayInS);\n}\n\nexport class InterruptionStreamBase {\n private inputStream: StreamChannel<InterruptionSentinel | AudioFrame, InterruptionDetectionError>;\n\n private eventStream: ReadableStream<OverlappingSpeechEvent>;\n\n private resampler?: AudioResampler;\n\n private numRequests = 0;\n\n private userSpeakingSpan: Span | undefined;\n\n private overlapSpeechStartedAt: number | undefined;\n\n private options: InterruptionOptions;\n\n private apiOptions: ApiConnectOptions;\n\n private model: AdaptiveInterruptionDetector;\n\n private logger = log();\n\n // Store reconnect function for WebSocket transport\n private wsReconnect?: () => Promise<void>;\n\n // Mutable transport options that can be updated via updateOptions()\n private transportOptions: {\n baseUrl: string;\n apiKey: string;\n apiSecret: string;\n sampleRate: number;\n threshold: number;\n minFrames: number;\n timeout: number;\n maxRetries: number;\n };\n\n constructor(model: AdaptiveInterruptionDetector, apiOptions: Partial<ApiConnectOptions>) {\n this.inputStream = createStreamChannel<\n InterruptionSentinel | AudioFrame,\n InterruptionDetectionError\n >();\n\n this.model = model;\n this.options = { ...model.options };\n this.apiOptions = { ...apiConnectDefaults, ...apiOptions };\n\n // Initialize mutable transport options\n this.transportOptions = {\n baseUrl: this.options.baseUrl,\n apiKey: this.options.apiKey,\n apiSecret: this.options.apiSecret,\n sampleRate: this.options.sampleRate,\n threshold: this.options.threshold,\n minFrames: this.options.minFrames,\n timeout: this.options.inferenceTimeout,\n maxRetries: this.apiOptions.maxRetries,\n };\n\n this.eventStream = this.setupTransform();\n }\n\n /**\n * Update stream options. For WebSocket transport, this triggers a reconnection.\n */\n async updateOptions(options: {\n threshold?: number;\n minInterruptionDurationInS?: number;\n }): Promise<void> {\n if (options.threshold !== undefined) {\n this.options.threshold = options.threshold;\n this.transportOptions.threshold = options.threshold;\n }\n if (options.minInterruptionDurationInS !== undefined) {\n this.options.minInterruptionDurationInS = options.minInterruptionDurationInS;\n this.options.minFrames = Math.ceil(options.minInterruptionDurationInS * FRAMES_PER_SECOND);\n this.transportOptions.minFrames = this.options.minFrames;\n }\n // Trigger WebSocket reconnection if using proxy (WebSocket transport)\n if (this.options.useProxy && this.wsReconnect) {\n await this.wsReconnect();\n }\n }\n\n private setupTransform(): ReadableStream<OverlappingSpeechEvent> {\n let agentSpeechStarted = false;\n let startIdx = 0;\n let accumulatedSamples = 0;\n let overlapSpeechStarted = false;\n let overlapCount = 0;\n const cache = new BoundedCache<number, InterruptionCacheEntry>(10);\n const inferenceS16Data = new Int16Array(\n Math.ceil(this.options.maxAudioDurationInS * this.options.sampleRate),\n ).fill(0);\n\n // State accessors for transport\n const getState = () => ({\n overlapSpeechStarted,\n overlapSpeechStartedAt: this.overlapSpeechStartedAt,\n cache,\n overlapCount,\n });\n const setState = (partial: { overlapSpeechStarted?: boolean }) => {\n if (partial.overlapSpeechStarted !== undefined) {\n overlapSpeechStarted = partial.overlapSpeechStarted;\n }\n };\n const handleSpanUpdate = (entry: InterruptionCacheEntry) => {\n if (this.userSpeakingSpan) {\n updateUserSpeakingSpan(this.userSpeakingSpan, entry);\n this.userSpeakingSpan = undefined;\n }\n };\n\n const onRequestSent = () => {\n this.numRequests++;\n };\n\n const getAndResetNumRequests = (): number => {\n const n = this.numRequests;\n this.numRequests = 0;\n return n;\n };\n\n // First transform: process input frames/sentinels and output audio slices or events\n const audioTransformer = new TransformStream<\n InterruptionSentinel | AudioFrame,\n Int16Array | OverlappingSpeechEvent\n >(\n {\n transform: (chunk, controller) => {\n if (chunk instanceof AudioFrame) {\n if (!agentSpeechStarted) {\n return;\n }\n if (this.options.sampleRate !== chunk.sampleRate) {\n controller.error('the sample rate of the input frames must be consistent');\n this.logger.error('the sample rate of the input frames must be consistent');\n return;\n }\n const result = writeToInferenceS16Data(\n chunk,\n startIdx,\n inferenceS16Data,\n this.options.maxAudioDurationInS,\n );\n startIdx = result.startIdx;\n accumulatedSamples += result.samplesWritten;\n\n if (\n accumulatedSamples >=\n Math.floor(this.options.detectionIntervalInS * this.options.sampleRate) &&\n overlapSpeechStarted\n ) {\n const audioSlice = inferenceS16Data.slice(0, startIdx);\n accumulatedSamples = 0;\n controller.enqueue(audioSlice);\n }\n } else if (chunk.type === 'agent-speech-started') {\n this.logger.debug('agent speech started');\n agentSpeechStarted = true;\n overlapSpeechStarted = false;\n this.overlapSpeechStartedAt = undefined;\n accumulatedSamples = 0;\n overlapCount = 0;\n startIdx = 0;\n this.numRequests = 0;\n cache.clear();\n } else if (chunk.type === 'agent-speech-ended') {\n this.logger.debug('agent speech ended');\n agentSpeechStarted = false;\n overlapSpeechStarted = false;\n this.overlapSpeechStartedAt = undefined;\n accumulatedSamples = 0;\n overlapCount = 0;\n startIdx = 0;\n this.numRequests = 0;\n cache.clear();\n } else if (chunk.type === 'overlap-speech-started' && agentSpeechStarted) {\n this.overlapSpeechStartedAt = chunk.startedAt;\n this.userSpeakingSpan = chunk.userSpeakingSpan;\n this.logger.debug('overlap speech started, starting interruption inference');\n overlapSpeechStarted = true;\n accumulatedSamples = 0;\n overlapCount += 1;\n if (overlapCount <= 1) {\n const keepSize =\n Math.round((chunk.speechDuration / 1000) * this.options.sampleRate) +\n Math.round(this.options.audioPrefixDurationInS * this.options.sampleRate);\n const shiftCount = Math.max(0, startIdx - keepSize);\n inferenceS16Data.copyWithin(0, shiftCount, startIdx);\n startIdx -= shiftCount;\n }\n cache.clear();\n } else if (chunk.type === 'overlap-speech-ended') {\n this.logger.debug('overlap speech ended');\n if (overlapSpeechStarted) {\n this.userSpeakingSpan = undefined;\n let latestEntry = cache.pop(\n (entry) => entry.totalDurationInS !== undefined && entry.totalDurationInS > 0,\n );\n if (!latestEntry) {\n this.logger.debug('no request made for overlap speech');\n latestEntry = InterruptionCacheEntry.default();\n }\n const e = latestEntry ?? InterruptionCacheEntry.default();\n const event: OverlappingSpeechEvent = {\n type: 'overlapping_speech',\n detectedAt: chunk.endedAt,\n isInterruption: false,\n overlapStartedAt: this.overlapSpeechStartedAt,\n speechInput: e.speechInput,\n probabilities: e.probabilities,\n totalDurationInS: e.totalDurationInS,\n detectionDelayInS: e.detectionDelayInS,\n predictionDurationInS: e.predictionDurationInS,\n probability: e.probability,\n numRequests: getAndResetNumRequests(),\n };\n controller.enqueue(event);\n overlapSpeechStarted = false;\n accumulatedSamples = 0;\n }\n this.overlapSpeechStartedAt = undefined;\n } else if (chunk.type === 'flush') {\n // no-op\n }\n },\n },\n { highWaterMark: 32 },\n { highWaterMark: 32 },\n );\n\n // Second transform: transport layer (HTTP or WebSocket based on useProxy)\n const transportOptions = this.transportOptions;\n\n let transport: TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent>;\n if (this.options.useProxy) {\n const wsResult = createWsTransport(\n transportOptions,\n getState,\n setState,\n handleSpanUpdate,\n onRequestSent,\n getAndResetNumRequests,\n );\n transport = wsResult.transport;\n this.wsReconnect = wsResult.reconnect;\n } else {\n transport = createHttpTransport(\n transportOptions,\n getState,\n setState,\n handleSpanUpdate,\n getAndResetNumRequests,\n );\n }\n\n const eventEmitter = new TransformStream<OverlappingSpeechEvent, OverlappingSpeechEvent>({\n transform: (chunk, controller) => {\n this.model.emit('overlapping_speech', chunk);\n\n const metrics: InterruptionMetrics = {\n type: 'interruption_metrics',\n timestamp: chunk.detectedAt,\n totalDuration: chunk.totalDurationInS * 1000,\n predictionDuration: chunk.predictionDurationInS * 1000,\n detectionDelay: chunk.detectionDelayInS * 1000,\n numInterruptions: chunk.isInterruption ? 1 : 0,\n numBackchannels: chunk.isInterruption ? 0 : 1,\n numRequests: chunk.numRequests,\n metadata: {\n modelProvider: this.model.provider,\n modelName: this.model.model,\n },\n };\n this.model.emit('metrics_collected', metrics);\n\n controller.enqueue(chunk);\n },\n });\n\n // Pipeline: input -> audioTransformer -> transport -> eventEmitter -> eventStream\n return this.inputStream\n .stream()\n .pipeThrough(audioTransformer)\n .pipeThrough(transport)\n .pipeThrough(eventEmitter);\n }\n\n private ensureInputNotEnded() {\n if (this.inputStream.closed) {\n throw new Error('input stream is closed');\n }\n }\n\n private ensureStreamsNotEnded() {\n this.ensureInputNotEnded();\n }\n\n private getResamplerFor(inputSampleRate: number): AudioResampler {\n if (!this.resampler) {\n this.resampler = new AudioResampler(inputSampleRate, this.options.sampleRate);\n }\n return this.resampler;\n }\n\n stream(): ReadableStream<OverlappingSpeechEvent> {\n return this.eventStream;\n }\n\n async pushFrame(frame: InterruptionSentinel | AudioFrame): Promise<void> {\n this.ensureStreamsNotEnded();\n if (!(frame instanceof AudioFrame)) {\n return this.inputStream.write(frame);\n } else if (this.options.sampleRate !== frame.sampleRate) {\n const resampler = this.getResamplerFor(frame.sampleRate);\n if (resampler.inputRate !== frame.sampleRate) {\n throw new Error('the sample rate of the input frames must be consistent');\n }\n for (const resampledFrame of resampler.push(frame)) {\n await this.inputStream.write(resampledFrame);\n }\n } else {\n await this.inputStream.write(frame);\n }\n }\n\n async flush(): Promise<void> {\n this.ensureStreamsNotEnded();\n await this.inputStream.write(InterruptionStreamSentinel.flush());\n }\n\n async endInput(): Promise<void> {\n await this.flush();\n await this.inputStream.close();\n }\n\n async close(): Promise<void> {\n if (!this.inputStream.closed) await this.inputStream.close();\n this.model.removeStream(this);\n }\n}\n\n/**\n * Write the audio frame to the output data array and return the new start index\n * and the number of samples written.\n */\nfunction writeToInferenceS16Data(\n frame: AudioFrame,\n startIdx: number,\n outData: Int16Array,\n maxAudioDuration: number,\n): { startIdx: number; samplesWritten: number } {\n const maxWindowSize = Math.floor(maxAudioDuration * frame.sampleRate);\n\n if (frame.samplesPerChannel > outData.length) {\n throw new Error('frame samples are greater than the max window size');\n }\n\n // Shift the data to the left if the window would overflow\n const shift = startIdx + frame.samplesPerChannel - maxWindowSize;\n if (shift > 0) {\n outData.copyWithin(0, shift, startIdx);\n startIdx -= shift;\n }\n\n // Get the frame data as Int16Array\n const frameData = new Int16Array(\n frame.data.buffer,\n frame.data.byteOffset,\n frame.samplesPerChannel * frame.channels,\n );\n\n if (frame.channels > 1) {\n // Mix down multiple channels to mono by averaging\n for (let i = 0; i < frame.samplesPerChannel; i++) {\n let sum = 0;\n for (let ch = 0; ch < frame.channels; ch++) {\n sum += frameData[i * frame.channels + ch] ?? 0;\n }\n outData[startIdx + i] = Math.floor(sum / frame.channels);\n }\n } else {\n // Single channel - copy directly\n outData.set(frameData, startIdx);\n }\n\n startIdx += frame.samplesPerChannel;\n return { startIdx, samplesWritten: frame.samplesPerChannel };\n}\n"],"mappings":"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","names":[]}