@livekit/agents 1.0.47 → 1.1.0-dev.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 (444) hide show
  1. package/dist/beta/index.cjs +29 -0
  2. package/dist/beta/index.cjs.map +1 -0
  3. package/dist/beta/index.d.cts +2 -0
  4. package/dist/beta/index.d.ts +2 -0
  5. package/dist/beta/index.d.ts.map +1 -0
  6. package/dist/beta/index.js +7 -0
  7. package/dist/beta/index.js.map +1 -0
  8. package/dist/beta/workflows/index.cjs +29 -0
  9. package/dist/beta/workflows/index.cjs.map +1 -0
  10. package/dist/beta/workflows/index.d.cts +2 -0
  11. package/dist/beta/workflows/index.d.ts +2 -0
  12. package/dist/beta/workflows/index.d.ts.map +1 -0
  13. package/dist/beta/workflows/index.js +7 -0
  14. package/dist/beta/workflows/index.js.map +1 -0
  15. package/dist/beta/workflows/task_group.cjs +162 -0
  16. package/dist/beta/workflows/task_group.cjs.map +1 -0
  17. package/dist/beta/workflows/task_group.d.cts +32 -0
  18. package/dist/beta/workflows/task_group.d.ts +32 -0
  19. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  20. package/dist/beta/workflows/task_group.js +138 -0
  21. package/dist/beta/workflows/task_group.js.map +1 -0
  22. package/dist/constants.cjs +27 -0
  23. package/dist/constants.cjs.map +1 -1
  24. package/dist/constants.d.cts +9 -0
  25. package/dist/constants.d.ts +9 -0
  26. package/dist/constants.d.ts.map +1 -1
  27. package/dist/constants.js +18 -0
  28. package/dist/constants.js.map +1 -1
  29. package/dist/index.cjs +3 -0
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +2 -1
  32. package/dist/index.d.ts +2 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/inference/api_protos.d.cts +12 -12
  37. package/dist/inference/api_protos.d.ts +12 -12
  38. package/dist/inference/interruption/defaults.cjs +81 -0
  39. package/dist/inference/interruption/defaults.cjs.map +1 -0
  40. package/dist/inference/interruption/defaults.d.cts +19 -0
  41. package/dist/inference/interruption/defaults.d.ts +19 -0
  42. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  43. package/dist/inference/interruption/defaults.js +46 -0
  44. package/dist/inference/interruption/defaults.js.map +1 -0
  45. package/dist/inference/interruption/errors.cjs +44 -0
  46. package/dist/inference/interruption/errors.cjs.map +1 -0
  47. package/dist/inference/interruption/errors.d.cts +12 -0
  48. package/dist/inference/interruption/errors.d.ts +12 -0
  49. package/dist/inference/interruption/errors.d.ts.map +1 -0
  50. package/dist/inference/interruption/errors.js +20 -0
  51. package/dist/inference/interruption/errors.js.map +1 -0
  52. package/dist/inference/interruption/http_transport.cjs +147 -0
  53. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  54. package/dist/inference/interruption/http_transport.d.cts +63 -0
  55. package/dist/inference/interruption/http_transport.d.ts +63 -0
  56. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  57. package/dist/inference/interruption/http_transport.js +121 -0
  58. package/dist/inference/interruption/http_transport.js.map +1 -0
  59. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  60. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  61. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  62. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  63. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  64. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  65. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  66. package/dist/inference/interruption/interruption_detector.cjs +181 -0
  67. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  68. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  69. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  70. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  71. package/dist/inference/interruption/interruption_detector.js +147 -0
  72. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  73. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  74. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  75. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  76. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  77. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  78. package/dist/inference/interruption/interruption_stream.js +344 -0
  79. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  80. package/dist/inference/interruption/types.cjs +17 -0
  81. package/dist/inference/interruption/types.cjs.map +1 -0
  82. package/dist/inference/interruption/types.d.cts +66 -0
  83. package/dist/inference/interruption/types.d.ts +66 -0
  84. package/dist/inference/interruption/types.d.ts.map +1 -0
  85. package/dist/inference/interruption/types.js +1 -0
  86. package/dist/inference/interruption/types.js.map +1 -0
  87. package/dist/inference/interruption/utils.cjs +130 -0
  88. package/dist/inference/interruption/utils.cjs.map +1 -0
  89. package/dist/inference/interruption/utils.d.cts +41 -0
  90. package/dist/inference/interruption/utils.d.ts +41 -0
  91. package/dist/inference/interruption/utils.d.ts.map +1 -0
  92. package/dist/inference/interruption/utils.js +105 -0
  93. package/dist/inference/interruption/utils.js.map +1 -0
  94. package/dist/inference/interruption/utils.test.cjs +105 -0
  95. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  96. package/dist/inference/interruption/utils.test.js +104 -0
  97. package/dist/inference/interruption/utils.test.js.map +1 -0
  98. package/dist/inference/interruption/ws_transport.cjs +329 -0
  99. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  100. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  101. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  102. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  103. package/dist/inference/interruption/ws_transport.js +295 -0
  104. package/dist/inference/interruption/ws_transport.js.map +1 -0
  105. package/dist/inference/llm.cjs +14 -10
  106. package/dist/inference/llm.cjs.map +1 -1
  107. package/dist/inference/llm.d.cts +2 -1
  108. package/dist/inference/llm.d.ts +2 -1
  109. package/dist/inference/llm.d.ts.map +1 -1
  110. package/dist/inference/llm.js +8 -10
  111. package/dist/inference/llm.js.map +1 -1
  112. package/dist/inference/stt.cjs +7 -2
  113. package/dist/inference/stt.cjs.map +1 -1
  114. package/dist/inference/stt.d.cts +2 -0
  115. package/dist/inference/stt.d.ts +2 -0
  116. package/dist/inference/stt.d.ts.map +1 -1
  117. package/dist/inference/stt.js +8 -3
  118. package/dist/inference/stt.js.map +1 -1
  119. package/dist/inference/tts.cjs +7 -2
  120. package/dist/inference/tts.cjs.map +1 -1
  121. package/dist/inference/tts.d.cts +2 -0
  122. package/dist/inference/tts.d.ts +2 -0
  123. package/dist/inference/tts.d.ts.map +1 -1
  124. package/dist/inference/tts.js +8 -3
  125. package/dist/inference/tts.js.map +1 -1
  126. package/dist/inference/utils.cjs +26 -7
  127. package/dist/inference/utils.cjs.map +1 -1
  128. package/dist/inference/utils.d.cts +13 -0
  129. package/dist/inference/utils.d.ts +13 -0
  130. package/dist/inference/utils.d.ts.map +1 -1
  131. package/dist/inference/utils.js +18 -2
  132. package/dist/inference/utils.js.map +1 -1
  133. package/dist/llm/chat_context.cjs +108 -2
  134. package/dist/llm/chat_context.cjs.map +1 -1
  135. package/dist/llm/chat_context.d.cts +28 -1
  136. package/dist/llm/chat_context.d.ts +28 -1
  137. package/dist/llm/chat_context.d.ts.map +1 -1
  138. package/dist/llm/chat_context.js +108 -2
  139. package/dist/llm/chat_context.js.map +1 -1
  140. package/dist/llm/chat_context.test.cjs +43 -0
  141. package/dist/llm/chat_context.test.cjs.map +1 -1
  142. package/dist/llm/chat_context.test.js +43 -0
  143. package/dist/llm/chat_context.test.js.map +1 -1
  144. package/dist/llm/index.cjs +2 -0
  145. package/dist/llm/index.cjs.map +1 -1
  146. package/dist/llm/index.d.cts +2 -2
  147. package/dist/llm/index.d.ts +2 -2
  148. package/dist/llm/index.d.ts.map +1 -1
  149. package/dist/llm/index.js +3 -1
  150. package/dist/llm/index.js.map +1 -1
  151. package/dist/llm/llm.cjs +16 -1
  152. package/dist/llm/llm.cjs.map +1 -1
  153. package/dist/llm/llm.d.cts +9 -0
  154. package/dist/llm/llm.d.ts +9 -0
  155. package/dist/llm/llm.d.ts.map +1 -1
  156. package/dist/llm/llm.js +16 -1
  157. package/dist/llm/llm.js.map +1 -1
  158. package/dist/llm/provider_format/index.d.cts +1 -1
  159. package/dist/llm/provider_format/index.d.ts +1 -1
  160. package/dist/llm/realtime.cjs +3 -0
  161. package/dist/llm/realtime.cjs.map +1 -1
  162. package/dist/llm/realtime.d.cts +1 -0
  163. package/dist/llm/realtime.d.ts +1 -0
  164. package/dist/llm/realtime.d.ts.map +1 -1
  165. package/dist/llm/realtime.js +3 -0
  166. package/dist/llm/realtime.js.map +1 -1
  167. package/dist/llm/tool_context.cjs +7 -0
  168. package/dist/llm/tool_context.cjs.map +1 -1
  169. package/dist/llm/tool_context.d.cts +10 -2
  170. package/dist/llm/tool_context.d.ts +10 -2
  171. package/dist/llm/tool_context.d.ts.map +1 -1
  172. package/dist/llm/tool_context.js +6 -0
  173. package/dist/llm/tool_context.js.map +1 -1
  174. package/dist/metrics/base.cjs.map +1 -1
  175. package/dist/metrics/base.d.cts +45 -1
  176. package/dist/metrics/base.d.ts +45 -1
  177. package/dist/metrics/base.d.ts.map +1 -1
  178. package/dist/metrics/index.cjs +5 -0
  179. package/dist/metrics/index.cjs.map +1 -1
  180. package/dist/metrics/index.d.cts +2 -1
  181. package/dist/metrics/index.d.ts +2 -1
  182. package/dist/metrics/index.d.ts.map +1 -1
  183. package/dist/metrics/index.js +6 -0
  184. package/dist/metrics/index.js.map +1 -1
  185. package/dist/metrics/model_usage.cjs +189 -0
  186. package/dist/metrics/model_usage.cjs.map +1 -0
  187. package/dist/metrics/model_usage.d.cts +92 -0
  188. package/dist/metrics/model_usage.d.ts +92 -0
  189. package/dist/metrics/model_usage.d.ts.map +1 -0
  190. package/dist/metrics/model_usage.js +164 -0
  191. package/dist/metrics/model_usage.js.map +1 -0
  192. package/dist/metrics/model_usage.test.cjs +474 -0
  193. package/dist/metrics/model_usage.test.cjs.map +1 -0
  194. package/dist/metrics/model_usage.test.js +476 -0
  195. package/dist/metrics/model_usage.test.js.map +1 -0
  196. package/dist/metrics/usage_collector.cjs +3 -0
  197. package/dist/metrics/usage_collector.cjs.map +1 -1
  198. package/dist/metrics/usage_collector.d.cts +9 -0
  199. package/dist/metrics/usage_collector.d.ts +9 -0
  200. package/dist/metrics/usage_collector.d.ts.map +1 -1
  201. package/dist/metrics/usage_collector.js +3 -0
  202. package/dist/metrics/usage_collector.js.map +1 -1
  203. package/dist/metrics/utils.cjs +9 -0
  204. package/dist/metrics/utils.cjs.map +1 -1
  205. package/dist/metrics/utils.d.ts.map +1 -1
  206. package/dist/metrics/utils.js +9 -0
  207. package/dist/metrics/utils.js.map +1 -1
  208. package/dist/stream/multi_input_stream.test.cjs +4 -0
  209. package/dist/stream/multi_input_stream.test.cjs.map +1 -1
  210. package/dist/stream/multi_input_stream.test.js +5 -1
  211. package/dist/stream/multi_input_stream.test.js.map +1 -1
  212. package/dist/stream/stream_channel.cjs +31 -0
  213. package/dist/stream/stream_channel.cjs.map +1 -1
  214. package/dist/stream/stream_channel.d.cts +4 -2
  215. package/dist/stream/stream_channel.d.ts +4 -2
  216. package/dist/stream/stream_channel.d.ts.map +1 -1
  217. package/dist/stream/stream_channel.js +31 -0
  218. package/dist/stream/stream_channel.js.map +1 -1
  219. package/dist/stt/stt.cjs +34 -2
  220. package/dist/stt/stt.cjs.map +1 -1
  221. package/dist/stt/stt.d.cts +22 -0
  222. package/dist/stt/stt.d.ts +22 -0
  223. package/dist/stt/stt.d.ts.map +1 -1
  224. package/dist/stt/stt.js +34 -2
  225. package/dist/stt/stt.js.map +1 -1
  226. package/dist/telemetry/otel_http_exporter.cjs +24 -5
  227. package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
  228. package/dist/telemetry/otel_http_exporter.d.cts +1 -0
  229. package/dist/telemetry/otel_http_exporter.d.ts +1 -0
  230. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
  231. package/dist/telemetry/otel_http_exporter.js +24 -5
  232. package/dist/telemetry/otel_http_exporter.js.map +1 -1
  233. package/dist/telemetry/trace_types.cjs +5 -5
  234. package/dist/telemetry/trace_types.cjs.map +1 -1
  235. package/dist/telemetry/trace_types.d.cts +9 -5
  236. package/dist/telemetry/trace_types.d.ts +9 -5
  237. package/dist/telemetry/trace_types.d.ts.map +1 -1
  238. package/dist/telemetry/trace_types.js +5 -5
  239. package/dist/telemetry/trace_types.js.map +1 -1
  240. package/dist/telemetry/traces.cjs +47 -8
  241. package/dist/telemetry/traces.cjs.map +1 -1
  242. package/dist/telemetry/traces.d.ts.map +1 -1
  243. package/dist/telemetry/traces.js +47 -8
  244. package/dist/telemetry/traces.js.map +1 -1
  245. package/dist/tts/tts.cjs +64 -2
  246. package/dist/tts/tts.cjs.map +1 -1
  247. package/dist/tts/tts.d.cts +34 -0
  248. package/dist/tts/tts.d.ts +34 -0
  249. package/dist/tts/tts.d.ts.map +1 -1
  250. package/dist/tts/tts.js +64 -2
  251. package/dist/tts/tts.js.map +1 -1
  252. package/dist/utils.cjs +1 -0
  253. package/dist/utils.cjs.map +1 -1
  254. package/dist/utils.d.ts.map +1 -1
  255. package/dist/utils.js +1 -0
  256. package/dist/utils.js.map +1 -1
  257. package/dist/version.cjs +1 -1
  258. package/dist/version.js +1 -1
  259. package/dist/voice/agent.cjs +34 -4
  260. package/dist/voice/agent.cjs.map +1 -1
  261. package/dist/voice/agent.d.cts +11 -2
  262. package/dist/voice/agent.d.ts +11 -2
  263. package/dist/voice/agent.d.ts.map +1 -1
  264. package/dist/voice/agent.js +34 -4
  265. package/dist/voice/agent.js.map +1 -1
  266. package/dist/voice/agent_activity.cjs +292 -44
  267. package/dist/voice/agent_activity.cjs.map +1 -1
  268. package/dist/voice/agent_activity.d.cts +27 -6
  269. package/dist/voice/agent_activity.d.ts +27 -6
  270. package/dist/voice/agent_activity.d.ts.map +1 -1
  271. package/dist/voice/agent_activity.js +293 -45
  272. package/dist/voice/agent_activity.js.map +1 -1
  273. package/dist/voice/agent_session.cjs +105 -48
  274. package/dist/voice/agent_session.cjs.map +1 -1
  275. package/dist/voice/agent_session.d.cts +90 -20
  276. package/dist/voice/agent_session.d.ts +90 -20
  277. package/dist/voice/agent_session.d.ts.map +1 -1
  278. package/dist/voice/agent_session.js +105 -46
  279. package/dist/voice/agent_session.js.map +1 -1
  280. package/dist/voice/audio_recognition.cjs +287 -6
  281. package/dist/voice/audio_recognition.cjs.map +1 -1
  282. package/dist/voice/audio_recognition.d.cts +42 -3
  283. package/dist/voice/audio_recognition.d.ts +42 -3
  284. package/dist/voice/audio_recognition.d.ts.map +1 -1
  285. package/dist/voice/audio_recognition.js +289 -7
  286. package/dist/voice/audio_recognition.js.map +1 -1
  287. package/dist/voice/client_events.cjs +554 -0
  288. package/dist/voice/client_events.cjs.map +1 -0
  289. package/dist/voice/client_events.d.cts +195 -0
  290. package/dist/voice/client_events.d.ts +195 -0
  291. package/dist/voice/client_events.d.ts.map +1 -0
  292. package/dist/voice/client_events.js +548 -0
  293. package/dist/voice/client_events.js.map +1 -0
  294. package/dist/voice/events.cjs +1 -0
  295. package/dist/voice/events.cjs.map +1 -1
  296. package/dist/voice/events.d.cts +8 -5
  297. package/dist/voice/events.d.ts +8 -5
  298. package/dist/voice/events.d.ts.map +1 -1
  299. package/dist/voice/events.js +1 -0
  300. package/dist/voice/events.js.map +1 -1
  301. package/dist/voice/generation.cjs +43 -8
  302. package/dist/voice/generation.cjs.map +1 -1
  303. package/dist/voice/generation.d.cts +3 -3
  304. package/dist/voice/generation.d.ts +3 -3
  305. package/dist/voice/generation.d.ts.map +1 -1
  306. package/dist/voice/generation.js +43 -8
  307. package/dist/voice/generation.js.map +1 -1
  308. package/dist/voice/index.cjs +1 -0
  309. package/dist/voice/index.cjs.map +1 -1
  310. package/dist/voice/index.d.cts +1 -0
  311. package/dist/voice/index.d.ts +1 -0
  312. package/dist/voice/index.d.ts.map +1 -1
  313. package/dist/voice/index.js +1 -0
  314. package/dist/voice/index.js.map +1 -1
  315. package/dist/voice/report.cjs +20 -8
  316. package/dist/voice/report.cjs.map +1 -1
  317. package/dist/voice/report.d.cts +5 -0
  318. package/dist/voice/report.d.ts +5 -0
  319. package/dist/voice/report.d.ts.map +1 -1
  320. package/dist/voice/report.js +20 -8
  321. package/dist/voice/report.js.map +1 -1
  322. package/dist/voice/report.test.cjs +106 -0
  323. package/dist/voice/report.test.cjs.map +1 -0
  324. package/dist/voice/report.test.js +105 -0
  325. package/dist/voice/report.test.js.map +1 -0
  326. package/dist/voice/room_io/room_io.cjs +16 -41
  327. package/dist/voice/room_io/room_io.cjs.map +1 -1
  328. package/dist/voice/room_io/room_io.d.cts +4 -9
  329. package/dist/voice/room_io/room_io.d.ts +4 -9
  330. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  331. package/dist/voice/room_io/room_io.js +17 -43
  332. package/dist/voice/room_io/room_io.js.map +1 -1
  333. package/dist/voice/testing/fake_llm.cjs +127 -0
  334. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  335. package/dist/voice/testing/fake_llm.d.cts +30 -0
  336. package/dist/voice/testing/fake_llm.d.ts +30 -0
  337. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  338. package/dist/voice/testing/fake_llm.js +103 -0
  339. package/dist/voice/testing/fake_llm.js.map +1 -0
  340. package/dist/voice/testing/index.cjs +3 -0
  341. package/dist/voice/testing/index.cjs.map +1 -1
  342. package/dist/voice/testing/index.d.cts +1 -0
  343. package/dist/voice/testing/index.d.ts +1 -0
  344. package/dist/voice/testing/index.d.ts.map +1 -1
  345. package/dist/voice/testing/index.js +2 -0
  346. package/dist/voice/testing/index.js.map +1 -1
  347. package/dist/voice/turn_config/endpointing.cjs +33 -0
  348. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  349. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  350. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  351. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  352. package/dist/voice/turn_config/endpointing.js +9 -0
  353. package/dist/voice/turn_config/endpointing.js.map +1 -0
  354. package/dist/voice/turn_config/interruption.cjs +37 -0
  355. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  356. package/dist/voice/turn_config/interruption.d.cts +53 -0
  357. package/dist/voice/turn_config/interruption.d.ts +53 -0
  358. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  359. package/dist/voice/turn_config/interruption.js +13 -0
  360. package/dist/voice/turn_config/interruption.js.map +1 -0
  361. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  362. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  363. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  364. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  365. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  366. package/dist/voice/turn_config/turn_handling.js +11 -0
  367. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  368. package/dist/voice/turn_config/utils.cjs +97 -0
  369. package/dist/voice/turn_config/utils.cjs.map +1 -0
  370. package/dist/voice/turn_config/utils.d.cts +25 -0
  371. package/dist/voice/turn_config/utils.d.ts +25 -0
  372. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  373. package/dist/voice/turn_config/utils.js +73 -0
  374. package/dist/voice/turn_config/utils.js.map +1 -0
  375. package/dist/voice/turn_config/utils.test.cjs +86 -0
  376. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  377. package/dist/voice/turn_config/utils.test.js +85 -0
  378. package/dist/voice/turn_config/utils.test.js.map +1 -0
  379. package/dist/voice/wire_format.cjs +798 -0
  380. package/dist/voice/wire_format.cjs.map +1 -0
  381. package/dist/voice/wire_format.d.cts +5503 -0
  382. package/dist/voice/wire_format.d.ts +5503 -0
  383. package/dist/voice/wire_format.d.ts.map +1 -0
  384. package/dist/voice/wire_format.js +728 -0
  385. package/dist/voice/wire_format.js.map +1 -0
  386. package/package.json +2 -1
  387. package/src/beta/index.ts +9 -0
  388. package/src/beta/workflows/index.ts +9 -0
  389. package/src/beta/workflows/task_group.ts +194 -0
  390. package/src/constants.ts +13 -0
  391. package/src/index.ts +2 -1
  392. package/src/inference/interruption/defaults.ts +51 -0
  393. package/src/inference/interruption/errors.ts +25 -0
  394. package/src/inference/interruption/http_transport.ts +187 -0
  395. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  396. package/src/inference/interruption/interruption_detector.ts +188 -0
  397. package/src/inference/interruption/interruption_stream.ts +467 -0
  398. package/src/inference/interruption/types.ts +84 -0
  399. package/src/inference/interruption/utils.test.ts +132 -0
  400. package/src/inference/interruption/utils.ts +137 -0
  401. package/src/inference/interruption/ws_transport.ts +402 -0
  402. package/src/inference/llm.ts +9 -12
  403. package/src/inference/stt.ts +10 -3
  404. package/src/inference/tts.ts +10 -3
  405. package/src/inference/utils.ts +29 -1
  406. package/src/llm/chat_context.test.ts +48 -0
  407. package/src/llm/chat_context.ts +161 -0
  408. package/src/llm/index.ts +2 -0
  409. package/src/llm/llm.ts +16 -0
  410. package/src/llm/realtime.ts +4 -0
  411. package/src/llm/tool_context.ts +14 -0
  412. package/src/metrics/base.ts +48 -1
  413. package/src/metrics/index.ts +11 -0
  414. package/src/metrics/model_usage.test.ts +545 -0
  415. package/src/metrics/model_usage.ts +262 -0
  416. package/src/metrics/usage_collector.ts +11 -0
  417. package/src/metrics/utils.ts +11 -0
  418. package/src/stream/multi_input_stream.test.ts +6 -1
  419. package/src/stream/stream_channel.ts +34 -2
  420. package/src/stt/stt.ts +38 -0
  421. package/src/telemetry/otel_http_exporter.ts +28 -5
  422. package/src/telemetry/trace_types.ts +11 -8
  423. package/src/telemetry/traces.ts +111 -54
  424. package/src/tts/tts.ts +69 -1
  425. package/src/utils.ts +5 -0
  426. package/src/voice/agent.ts +41 -3
  427. package/src/voice/agent_activity.ts +371 -34
  428. package/src/voice/agent_session.ts +207 -59
  429. package/src/voice/audio_recognition.ts +385 -9
  430. package/src/voice/client_events.ts +838 -0
  431. package/src/voice/events.ts +14 -4
  432. package/src/voice/generation.ts +52 -9
  433. package/src/voice/index.ts +1 -0
  434. package/src/voice/report.test.ts +117 -0
  435. package/src/voice/report.ts +29 -6
  436. package/src/voice/room_io/room_io.ts +21 -64
  437. package/src/voice/testing/fake_llm.ts +138 -0
  438. package/src/voice/testing/index.ts +2 -0
  439. package/src/voice/turn_config/endpointing.ts +33 -0
  440. package/src/voice/turn_config/interruption.ts +56 -0
  441. package/src/voice/turn_config/turn_handling.ts +45 -0
  442. package/src/voice/turn_config/utils.test.ts +100 -0
  443. package/src/voice/turn_config/utils.ts +103 -0
  444. package/src/voice/wire_format.ts +827 -0
@@ -0,0 +1,20 @@
1
+ class InterruptionDetectionError extends Error {
2
+ type = "interruption_detection_error";
3
+ timestamp;
4
+ label;
5
+ recoverable;
6
+ constructor(message, timestamp, label, recoverable) {
7
+ super(message);
8
+ this.name = "InterruptionDetectionError";
9
+ this.timestamp = timestamp;
10
+ this.label = label;
11
+ this.recoverable = recoverable;
12
+ }
13
+ toString() {
14
+ return `${this.name}: ${this.message} (label=${this.label}, timestamp=${this.timestamp}, recoverable=${this.recoverable})`;
15
+ }
16
+ }
17
+ export {
18
+ InterruptionDetectionError
19
+ };
20
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/errors.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n/**\n * Error thrown during interruption detection.\n */\nexport class InterruptionDetectionError extends Error {\n readonly type = 'interruption_detection_error' as const;\n\n readonly timestamp: number;\n readonly label: string;\n readonly recoverable: boolean;\n\n constructor(message: string, timestamp: number, label: string, recoverable: boolean) {\n super(message);\n this.name = 'InterruptionDetectionError';\n this.timestamp = timestamp;\n this.label = label;\n this.recoverable = recoverable;\n }\n\n toString(): string {\n return `${this.name}: ${this.message} (label=${this.label}, timestamp=${this.timestamp}, recoverable=${this.recoverable})`;\n }\n}\n"],"mappings":"AAMO,MAAM,mCAAmC,MAAM;AAAA,EAC3C,OAAO;AAAA,EAEP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,WAAmB,OAAe,aAAsB;AACnF,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,QAAQ;AACb,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAmB;AACjB,WAAO,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,WAAW,KAAK,KAAK,eAAe,KAAK,SAAS,iBAAiB,KAAK,WAAW;AAAA,EACzH;AACF;","names":[]}
@@ -0,0 +1,147 @@
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 http_transport_exports = {};
20
+ __export(http_transport_exports, {
21
+ createHttpTransport: () => createHttpTransport,
22
+ predictEndpointResponseSchema: () => predictEndpointResponseSchema,
23
+ predictHTTP: () => predictHTTP
24
+ });
25
+ module.exports = __toCommonJS(http_transport_exports);
26
+ var import_ofetch = require("ofetch");
27
+ var import_web = require("stream/web");
28
+ var import_zod = require("zod");
29
+ var import_log = require("../../log.cjs");
30
+ var import_utils = require("../utils.cjs");
31
+ var import_defaults = require("./defaults.cjs");
32
+ var import_interruption_cache_entry = require("./interruption_cache_entry.cjs");
33
+ const predictEndpointResponseSchema = import_zod.z.object({
34
+ created_at: import_zod.z.number(),
35
+ is_bargein: import_zod.z.boolean(),
36
+ probabilities: import_zod.z.array(import_zod.z.number())
37
+ });
38
+ async function predictHTTP(data, predictOptions, options) {
39
+ const createdAt = performance.now();
40
+ const url = new URL(`/bargein`, options.baseUrl);
41
+ url.searchParams.append("threshold", predictOptions.threshold.toString());
42
+ url.searchParams.append("min_frames", predictOptions.minFrames.toFixed());
43
+ url.searchParams.append("created_at", createdAt.toFixed());
44
+ let retryCount = 0;
45
+ const response = await (0, import_ofetch.ofetch)(url.toString(), {
46
+ retry: options.maxRetries ?? 3,
47
+ retryDelay: () => {
48
+ const delay = (0, import_defaults.intervalForRetry)(retryCount);
49
+ retryCount++;
50
+ return delay;
51
+ },
52
+ headers: {
53
+ "Content-Type": "application/octet-stream",
54
+ Authorization: `Bearer ${options.token}`
55
+ },
56
+ signal: options.signal,
57
+ timeout: options.timeout,
58
+ method: "POST",
59
+ body: data
60
+ });
61
+ const { created_at, is_bargein, probabilities } = predictEndpointResponseSchema.parse(response);
62
+ return {
63
+ createdAt: created_at,
64
+ isBargein: is_bargein,
65
+ probabilities,
66
+ predictionDurationInS: (performance.now() - createdAt) / 1e3
67
+ };
68
+ }
69
+ function createHttpTransport(options, getState, setState, updateUserSpeakingSpan, getAndResetNumRequests) {
70
+ const logger = (0, import_log.log)();
71
+ return new import_web.TransformStream(
72
+ {
73
+ async transform(chunk, controller) {
74
+ if (!(chunk instanceof Int16Array)) {
75
+ controller.enqueue(chunk);
76
+ return;
77
+ }
78
+ const state = getState();
79
+ const overlapSpeechStartedAt = state.overlapSpeechStartedAt;
80
+ if (overlapSpeechStartedAt === void 0 || !state.overlapSpeechStarted) return;
81
+ try {
82
+ const resp = await predictHTTP(
83
+ chunk,
84
+ { threshold: options.threshold, minFrames: options.minFrames },
85
+ {
86
+ baseUrl: options.baseUrl,
87
+ timeout: options.timeout,
88
+ maxRetries: options.maxRetries,
89
+ token: await (0, import_utils.createAccessToken)(options.apiKey, options.apiSecret)
90
+ }
91
+ );
92
+ const { createdAt, isBargein, probabilities, predictionDurationInS } = resp;
93
+ const entry = state.cache.setOrUpdate(
94
+ createdAt,
95
+ () => new import_interruption_cache_entry.InterruptionCacheEntry({ createdAt }),
96
+ {
97
+ probabilities,
98
+ isInterruption: isBargein,
99
+ speechInput: chunk,
100
+ totalDurationInS: (performance.now() - createdAt) / 1e3,
101
+ detectionDelayInS: (Date.now() - overlapSpeechStartedAt) / 1e3,
102
+ predictionDurationInS
103
+ }
104
+ );
105
+ if (state.overlapSpeechStarted && entry.isInterruption) {
106
+ if (updateUserSpeakingSpan) {
107
+ updateUserSpeakingSpan(entry);
108
+ }
109
+ const event = {
110
+ type: "user_overlapping_speech",
111
+ timestamp: Date.now(),
112
+ overlapStartedAt: overlapSpeechStartedAt,
113
+ isInterruption: entry.isInterruption,
114
+ speechInput: entry.speechInput,
115
+ probabilities: entry.probabilities,
116
+ totalDurationInS: entry.totalDurationInS,
117
+ predictionDurationInS: entry.predictionDurationInS,
118
+ detectionDelayInS: entry.detectionDelayInS,
119
+ probability: entry.probability,
120
+ numRequests: (getAndResetNumRequests == null ? void 0 : getAndResetNumRequests()) ?? 0
121
+ };
122
+ logger.debug(
123
+ {
124
+ detectionDelayInS: entry.detectionDelayInS,
125
+ totalDurationInS: entry.totalDurationInS
126
+ },
127
+ "interruption detected"
128
+ );
129
+ setState({ overlapSpeechStarted: false });
130
+ controller.enqueue(event);
131
+ }
132
+ } catch (err) {
133
+ logger.error({ err }, "Failed to send audio data over HTTP");
134
+ }
135
+ }
136
+ },
137
+ { highWaterMark: 2 },
138
+ { highWaterMark: 2 }
139
+ );
140
+ }
141
+ // Annotate the CommonJS export names for ESM import in node:
142
+ 0 && (module.exports = {
143
+ createHttpTransport,
144
+ predictEndpointResponseSchema,
145
+ predictHTTP
146
+ });
147
+ //# sourceMappingURL=http_transport.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/http_transport.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ofetch } from 'ofetch';\nimport { TransformStream } from 'stream/web';\nimport { z } from 'zod';\nimport { log } from '../../log.js';\nimport { createAccessToken } from '../utils.js';\nimport { intervalForRetry } from './defaults.js';\nimport { InterruptionCacheEntry } from './interruption_cache_entry.js';\nimport type { OverlappingSpeechEvent } from './types.js';\nimport type { BoundedCache } from './utils.js';\n\nexport interface PostOptions {\n baseUrl: string;\n token: string;\n signal?: AbortSignal;\n timeout?: number;\n maxRetries?: number;\n}\n\nexport interface PredictOptions {\n threshold: number;\n minFrames: number;\n}\n\nexport const predictEndpointResponseSchema = z.object({\n created_at: z.number(),\n is_bargein: z.boolean(),\n probabilities: z.array(z.number()),\n});\n\nexport type PredictEndpointResponse = z.infer<typeof predictEndpointResponseSchema>;\n\nexport interface PredictResponse {\n createdAt: number;\n isBargein: boolean;\n probabilities: number[];\n predictionDurationInS: number;\n}\n\nexport async function predictHTTP(\n data: Int16Array,\n predictOptions: PredictOptions,\n options: PostOptions,\n): Promise<PredictResponse> {\n const createdAt = performance.now();\n const url = new URL(`/bargein`, options.baseUrl);\n url.searchParams.append('threshold', predictOptions.threshold.toString());\n url.searchParams.append('min_frames', predictOptions.minFrames.toFixed());\n url.searchParams.append('created_at', createdAt.toFixed());\n\n let retryCount = 0;\n const response = await ofetch(url.toString(), {\n retry: options.maxRetries ?? 3,\n retryDelay: () => {\n const delay = intervalForRetry(retryCount);\n retryCount++;\n return delay;\n },\n headers: {\n 'Content-Type': 'application/octet-stream',\n Authorization: `Bearer ${options.token}`,\n },\n signal: options.signal,\n timeout: options.timeout,\n method: 'POST',\n body: data,\n });\n const { created_at, is_bargein, probabilities } = predictEndpointResponseSchema.parse(response);\n\n return {\n createdAt: created_at,\n isBargein: is_bargein,\n probabilities,\n predictionDurationInS: (performance.now() - createdAt) / 1000,\n };\n}\n\nexport interface HttpTransportOptions {\n baseUrl: string;\n apiKey: string;\n apiSecret: string;\n threshold: number;\n minFrames: number;\n timeout: number;\n maxRetries?: number;\n}\n\nexport interface HttpTransportState {\n overlapSpeechStarted: boolean;\n overlapSpeechStartedAt: number | undefined;\n cache: BoundedCache<number, InterruptionCacheEntry>;\n}\n\n/**\n * Creates an HTTP transport TransformStream for interruption detection.\n *\n * This transport receives Int16Array audio slices and outputs InterruptionEvents.\n * Each audio slice triggers an HTTP POST request.\n *\n * @param options - Transport options object. This is read on each request, so mutations\n * to threshold/minFrames will be picked up dynamically.\n */\nexport function createHttpTransport(\n options: HttpTransportOptions,\n getState: () => HttpTransportState,\n setState: (partial: Partial<HttpTransportState>) => void,\n updateUserSpeakingSpan?: (entry: InterruptionCacheEntry) => void,\n getAndResetNumRequests?: () => number,\n): TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent> {\n const logger = log();\n\n return new TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent>(\n {\n async transform(chunk, controller) {\n if (!(chunk instanceof Int16Array)) {\n controller.enqueue(chunk);\n return;\n }\n\n const state = getState();\n const overlapSpeechStartedAt = state.overlapSpeechStartedAt;\n if (overlapSpeechStartedAt === undefined || !state.overlapSpeechStarted) return;\n\n try {\n const resp = await predictHTTP(\n chunk,\n { threshold: options.threshold, minFrames: options.minFrames },\n {\n baseUrl: options.baseUrl,\n timeout: options.timeout,\n maxRetries: options.maxRetries,\n token: await createAccessToken(options.apiKey, options.apiSecret),\n },\n );\n\n const { createdAt, isBargein, probabilities, predictionDurationInS } = resp;\n const entry = state.cache.setOrUpdate(\n createdAt,\n () => new InterruptionCacheEntry({ createdAt }),\n {\n probabilities,\n isInterruption: isBargein,\n speechInput: chunk,\n totalDurationInS: (performance.now() - createdAt) / 1000,\n detectionDelayInS: (Date.now() - overlapSpeechStartedAt) / 1000,\n predictionDurationInS,\n },\n );\n\n if (state.overlapSpeechStarted && entry.isInterruption) {\n if (updateUserSpeakingSpan) {\n updateUserSpeakingSpan(entry);\n }\n const event: OverlappingSpeechEvent = {\n type: 'user_overlapping_speech',\n timestamp: Date.now(),\n overlapStartedAt: overlapSpeechStartedAt,\n isInterruption: entry.isInterruption,\n speechInput: entry.speechInput,\n probabilities: entry.probabilities,\n totalDurationInS: entry.totalDurationInS,\n predictionDurationInS: entry.predictionDurationInS,\n detectionDelayInS: entry.detectionDelayInS,\n probability: entry.probability,\n numRequests: getAndResetNumRequests?.() ?? 0,\n };\n logger.debug(\n {\n detectionDelayInS: entry.detectionDelayInS,\n totalDurationInS: entry.totalDurationInS,\n },\n 'interruption detected',\n );\n setState({ overlapSpeechStarted: false });\n controller.enqueue(event);\n }\n } catch (err) {\n logger.error({ err }, 'Failed to send audio data over HTTP');\n }\n },\n },\n { highWaterMark: 2 },\n { highWaterMark: 2 },\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,63 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { TransformStream } from 'stream/web';
3
+ import { z } from 'zod';
4
+ import { InterruptionCacheEntry } from './interruption_cache_entry.js';
5
+ import type { OverlappingSpeechEvent } from './types.js';
6
+ import type { BoundedCache } from './utils.js';
7
+ export interface PostOptions {
8
+ baseUrl: string;
9
+ token: string;
10
+ signal?: AbortSignal;
11
+ timeout?: number;
12
+ maxRetries?: number;
13
+ }
14
+ export interface PredictOptions {
15
+ threshold: number;
16
+ minFrames: number;
17
+ }
18
+ export declare const predictEndpointResponseSchema: z.ZodObject<{
19
+ created_at: z.ZodNumber;
20
+ is_bargein: z.ZodBoolean;
21
+ probabilities: z.ZodArray<z.ZodNumber, "many">;
22
+ }, "strip", z.ZodTypeAny, {
23
+ created_at: number;
24
+ is_bargein: boolean;
25
+ probabilities: number[];
26
+ }, {
27
+ created_at: number;
28
+ is_bargein: boolean;
29
+ probabilities: number[];
30
+ }>;
31
+ export type PredictEndpointResponse = z.infer<typeof predictEndpointResponseSchema>;
32
+ export interface PredictResponse {
33
+ createdAt: number;
34
+ isBargein: boolean;
35
+ probabilities: number[];
36
+ predictionDurationInS: number;
37
+ }
38
+ export declare function predictHTTP(data: Int16Array, predictOptions: PredictOptions, options: PostOptions): Promise<PredictResponse>;
39
+ export interface HttpTransportOptions {
40
+ baseUrl: string;
41
+ apiKey: string;
42
+ apiSecret: string;
43
+ threshold: number;
44
+ minFrames: number;
45
+ timeout: number;
46
+ maxRetries?: number;
47
+ }
48
+ export interface HttpTransportState {
49
+ overlapSpeechStarted: boolean;
50
+ overlapSpeechStartedAt: number | undefined;
51
+ cache: BoundedCache<number, InterruptionCacheEntry>;
52
+ }
53
+ /**
54
+ * Creates an HTTP transport TransformStream for interruption detection.
55
+ *
56
+ * This transport receives Int16Array audio slices and outputs InterruptionEvents.
57
+ * Each audio slice triggers an HTTP POST request.
58
+ *
59
+ * @param options - Transport options object. This is read on each request, so mutations
60
+ * to threshold/minFrames will be picked up dynamically.
61
+ */
62
+ export declare function createHttpTransport(options: HttpTransportOptions, getState: () => HttpTransportState, setState: (partial: Partial<HttpTransportState>) => void, updateUserSpeakingSpan?: (entry: InterruptionCacheEntry) => void, getAndResetNumRequests?: () => number): TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent>;
63
+ //# sourceMappingURL=http_transport.d.ts.map
@@ -0,0 +1,63 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { TransformStream } from 'stream/web';
3
+ import { z } from 'zod';
4
+ import { InterruptionCacheEntry } from './interruption_cache_entry.js';
5
+ import type { OverlappingSpeechEvent } from './types.js';
6
+ import type { BoundedCache } from './utils.js';
7
+ export interface PostOptions {
8
+ baseUrl: string;
9
+ token: string;
10
+ signal?: AbortSignal;
11
+ timeout?: number;
12
+ maxRetries?: number;
13
+ }
14
+ export interface PredictOptions {
15
+ threshold: number;
16
+ minFrames: number;
17
+ }
18
+ export declare const predictEndpointResponseSchema: z.ZodObject<{
19
+ created_at: z.ZodNumber;
20
+ is_bargein: z.ZodBoolean;
21
+ probabilities: z.ZodArray<z.ZodNumber, "many">;
22
+ }, "strip", z.ZodTypeAny, {
23
+ created_at: number;
24
+ is_bargein: boolean;
25
+ probabilities: number[];
26
+ }, {
27
+ created_at: number;
28
+ is_bargein: boolean;
29
+ probabilities: number[];
30
+ }>;
31
+ export type PredictEndpointResponse = z.infer<typeof predictEndpointResponseSchema>;
32
+ export interface PredictResponse {
33
+ createdAt: number;
34
+ isBargein: boolean;
35
+ probabilities: number[];
36
+ predictionDurationInS: number;
37
+ }
38
+ export declare function predictHTTP(data: Int16Array, predictOptions: PredictOptions, options: PostOptions): Promise<PredictResponse>;
39
+ export interface HttpTransportOptions {
40
+ baseUrl: string;
41
+ apiKey: string;
42
+ apiSecret: string;
43
+ threshold: number;
44
+ minFrames: number;
45
+ timeout: number;
46
+ maxRetries?: number;
47
+ }
48
+ export interface HttpTransportState {
49
+ overlapSpeechStarted: boolean;
50
+ overlapSpeechStartedAt: number | undefined;
51
+ cache: BoundedCache<number, InterruptionCacheEntry>;
52
+ }
53
+ /**
54
+ * Creates an HTTP transport TransformStream for interruption detection.
55
+ *
56
+ * This transport receives Int16Array audio slices and outputs InterruptionEvents.
57
+ * Each audio slice triggers an HTTP POST request.
58
+ *
59
+ * @param options - Transport options object. This is read on each request, so mutations
60
+ * to threshold/minFrames will be picked up dynamically.
61
+ */
62
+ export declare function createHttpTransport(options: HttpTransportOptions, getState: () => HttpTransportState, setState: (partial: Partial<HttpTransportState>) => void, updateUserSpeakingSpan?: (entry: InterruptionCacheEntry) => void, getAndResetNumRequests?: () => number): TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent>;
63
+ //# sourceMappingURL=http_transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_transport.d.ts","sourceRoot":"","sources":["../../../src/inference/interruption/http_transport.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;EAIxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,kBAAkB,EAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,EACxD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,EAChE,sBAAsB,CAAC,EAAE,MAAM,MAAM,GACpC,eAAe,CAAC,UAAU,GAAG,sBAAsB,EAAE,sBAAsB,CAAC,CA4E9E"}
@@ -0,0 +1,121 @@
1
+ import { ofetch } from "ofetch";
2
+ import { TransformStream } from "stream/web";
3
+ import { z } from "zod";
4
+ import { log } from "../../log.js";
5
+ import { createAccessToken } from "../utils.js";
6
+ import { intervalForRetry } from "./defaults.js";
7
+ import { InterruptionCacheEntry } from "./interruption_cache_entry.js";
8
+ const predictEndpointResponseSchema = z.object({
9
+ created_at: z.number(),
10
+ is_bargein: z.boolean(),
11
+ probabilities: z.array(z.number())
12
+ });
13
+ async function predictHTTP(data, predictOptions, options) {
14
+ const createdAt = performance.now();
15
+ const url = new URL(`/bargein`, options.baseUrl);
16
+ url.searchParams.append("threshold", predictOptions.threshold.toString());
17
+ url.searchParams.append("min_frames", predictOptions.minFrames.toFixed());
18
+ url.searchParams.append("created_at", createdAt.toFixed());
19
+ let retryCount = 0;
20
+ const response = await ofetch(url.toString(), {
21
+ retry: options.maxRetries ?? 3,
22
+ retryDelay: () => {
23
+ const delay = intervalForRetry(retryCount);
24
+ retryCount++;
25
+ return delay;
26
+ },
27
+ headers: {
28
+ "Content-Type": "application/octet-stream",
29
+ Authorization: `Bearer ${options.token}`
30
+ },
31
+ signal: options.signal,
32
+ timeout: options.timeout,
33
+ method: "POST",
34
+ body: data
35
+ });
36
+ const { created_at, is_bargein, probabilities } = predictEndpointResponseSchema.parse(response);
37
+ return {
38
+ createdAt: created_at,
39
+ isBargein: is_bargein,
40
+ probabilities,
41
+ predictionDurationInS: (performance.now() - createdAt) / 1e3
42
+ };
43
+ }
44
+ function createHttpTransport(options, getState, setState, updateUserSpeakingSpan, getAndResetNumRequests) {
45
+ const logger = log();
46
+ return new TransformStream(
47
+ {
48
+ async transform(chunk, controller) {
49
+ if (!(chunk instanceof Int16Array)) {
50
+ controller.enqueue(chunk);
51
+ return;
52
+ }
53
+ const state = getState();
54
+ const overlapSpeechStartedAt = state.overlapSpeechStartedAt;
55
+ if (overlapSpeechStartedAt === void 0 || !state.overlapSpeechStarted) return;
56
+ try {
57
+ const resp = await predictHTTP(
58
+ chunk,
59
+ { threshold: options.threshold, minFrames: options.minFrames },
60
+ {
61
+ baseUrl: options.baseUrl,
62
+ timeout: options.timeout,
63
+ maxRetries: options.maxRetries,
64
+ token: await createAccessToken(options.apiKey, options.apiSecret)
65
+ }
66
+ );
67
+ const { createdAt, isBargein, probabilities, predictionDurationInS } = resp;
68
+ const entry = state.cache.setOrUpdate(
69
+ createdAt,
70
+ () => new InterruptionCacheEntry({ createdAt }),
71
+ {
72
+ probabilities,
73
+ isInterruption: isBargein,
74
+ speechInput: chunk,
75
+ totalDurationInS: (performance.now() - createdAt) / 1e3,
76
+ detectionDelayInS: (Date.now() - overlapSpeechStartedAt) / 1e3,
77
+ predictionDurationInS
78
+ }
79
+ );
80
+ if (state.overlapSpeechStarted && entry.isInterruption) {
81
+ if (updateUserSpeakingSpan) {
82
+ updateUserSpeakingSpan(entry);
83
+ }
84
+ const event = {
85
+ type: "user_overlapping_speech",
86
+ timestamp: Date.now(),
87
+ overlapStartedAt: overlapSpeechStartedAt,
88
+ isInterruption: entry.isInterruption,
89
+ speechInput: entry.speechInput,
90
+ probabilities: entry.probabilities,
91
+ totalDurationInS: entry.totalDurationInS,
92
+ predictionDurationInS: entry.predictionDurationInS,
93
+ detectionDelayInS: entry.detectionDelayInS,
94
+ probability: entry.probability,
95
+ numRequests: (getAndResetNumRequests == null ? void 0 : getAndResetNumRequests()) ?? 0
96
+ };
97
+ logger.debug(
98
+ {
99
+ detectionDelayInS: entry.detectionDelayInS,
100
+ totalDurationInS: entry.totalDurationInS
101
+ },
102
+ "interruption detected"
103
+ );
104
+ setState({ overlapSpeechStarted: false });
105
+ controller.enqueue(event);
106
+ }
107
+ } catch (err) {
108
+ logger.error({ err }, "Failed to send audio data over HTTP");
109
+ }
110
+ }
111
+ },
112
+ { highWaterMark: 2 },
113
+ { highWaterMark: 2 }
114
+ );
115
+ }
116
+ export {
117
+ createHttpTransport,
118
+ predictEndpointResponseSchema,
119
+ predictHTTP
120
+ };
121
+ //# sourceMappingURL=http_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/http_transport.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ofetch } from 'ofetch';\nimport { TransformStream } from 'stream/web';\nimport { z } from 'zod';\nimport { log } from '../../log.js';\nimport { createAccessToken } from '../utils.js';\nimport { intervalForRetry } from './defaults.js';\nimport { InterruptionCacheEntry } from './interruption_cache_entry.js';\nimport type { OverlappingSpeechEvent } from './types.js';\nimport type { BoundedCache } from './utils.js';\n\nexport interface PostOptions {\n baseUrl: string;\n token: string;\n signal?: AbortSignal;\n timeout?: number;\n maxRetries?: number;\n}\n\nexport interface PredictOptions {\n threshold: number;\n minFrames: number;\n}\n\nexport const predictEndpointResponseSchema = z.object({\n created_at: z.number(),\n is_bargein: z.boolean(),\n probabilities: z.array(z.number()),\n});\n\nexport type PredictEndpointResponse = z.infer<typeof predictEndpointResponseSchema>;\n\nexport interface PredictResponse {\n createdAt: number;\n isBargein: boolean;\n probabilities: number[];\n predictionDurationInS: number;\n}\n\nexport async function predictHTTP(\n data: Int16Array,\n predictOptions: PredictOptions,\n options: PostOptions,\n): Promise<PredictResponse> {\n const createdAt = performance.now();\n const url = new URL(`/bargein`, options.baseUrl);\n url.searchParams.append('threshold', predictOptions.threshold.toString());\n url.searchParams.append('min_frames', predictOptions.minFrames.toFixed());\n url.searchParams.append('created_at', createdAt.toFixed());\n\n let retryCount = 0;\n const response = await ofetch(url.toString(), {\n retry: options.maxRetries ?? 3,\n retryDelay: () => {\n const delay = intervalForRetry(retryCount);\n retryCount++;\n return delay;\n },\n headers: {\n 'Content-Type': 'application/octet-stream',\n Authorization: `Bearer ${options.token}`,\n },\n signal: options.signal,\n timeout: options.timeout,\n method: 'POST',\n body: data,\n });\n const { created_at, is_bargein, probabilities } = predictEndpointResponseSchema.parse(response);\n\n return {\n createdAt: created_at,\n isBargein: is_bargein,\n probabilities,\n predictionDurationInS: (performance.now() - createdAt) / 1000,\n };\n}\n\nexport interface HttpTransportOptions {\n baseUrl: string;\n apiKey: string;\n apiSecret: string;\n threshold: number;\n minFrames: number;\n timeout: number;\n maxRetries?: number;\n}\n\nexport interface HttpTransportState {\n overlapSpeechStarted: boolean;\n overlapSpeechStartedAt: number | undefined;\n cache: BoundedCache<number, InterruptionCacheEntry>;\n}\n\n/**\n * Creates an HTTP transport TransformStream for interruption detection.\n *\n * This transport receives Int16Array audio slices and outputs InterruptionEvents.\n * Each audio slice triggers an HTTP POST request.\n *\n * @param options - Transport options object. This is read on each request, so mutations\n * to threshold/minFrames will be picked up dynamically.\n */\nexport function createHttpTransport(\n options: HttpTransportOptions,\n getState: () => HttpTransportState,\n setState: (partial: Partial<HttpTransportState>) => void,\n updateUserSpeakingSpan?: (entry: InterruptionCacheEntry) => void,\n getAndResetNumRequests?: () => number,\n): TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent> {\n const logger = log();\n\n return new TransformStream<Int16Array | OverlappingSpeechEvent, OverlappingSpeechEvent>(\n {\n async transform(chunk, controller) {\n if (!(chunk instanceof Int16Array)) {\n controller.enqueue(chunk);\n return;\n }\n\n const state = getState();\n const overlapSpeechStartedAt = state.overlapSpeechStartedAt;\n if (overlapSpeechStartedAt === undefined || !state.overlapSpeechStarted) return;\n\n try {\n const resp = await predictHTTP(\n chunk,\n { threshold: options.threshold, minFrames: options.minFrames },\n {\n baseUrl: options.baseUrl,\n timeout: options.timeout,\n maxRetries: options.maxRetries,\n token: await createAccessToken(options.apiKey, options.apiSecret),\n },\n );\n\n const { createdAt, isBargein, probabilities, predictionDurationInS } = resp;\n const entry = state.cache.setOrUpdate(\n createdAt,\n () => new InterruptionCacheEntry({ createdAt }),\n {\n probabilities,\n isInterruption: isBargein,\n speechInput: chunk,\n totalDurationInS: (performance.now() - createdAt) / 1000,\n detectionDelayInS: (Date.now() - overlapSpeechStartedAt) / 1000,\n predictionDurationInS,\n },\n );\n\n if (state.overlapSpeechStarted && entry.isInterruption) {\n if (updateUserSpeakingSpan) {\n updateUserSpeakingSpan(entry);\n }\n const event: OverlappingSpeechEvent = {\n type: 'user_overlapping_speech',\n timestamp: Date.now(),\n overlapStartedAt: overlapSpeechStartedAt,\n isInterruption: entry.isInterruption,\n speechInput: entry.speechInput,\n probabilities: entry.probabilities,\n totalDurationInS: entry.totalDurationInS,\n predictionDurationInS: entry.predictionDurationInS,\n detectionDelayInS: entry.detectionDelayInS,\n probability: entry.probability,\n numRequests: getAndResetNumRequests?.() ?? 0,\n };\n logger.debug(\n {\n detectionDelayInS: entry.detectionDelayInS,\n totalDurationInS: entry.totalDurationInS,\n },\n 'interruption detected',\n );\n setState({ overlapSpeechStarted: false });\n controller.enqueue(event);\n }\n } catch (err) {\n logger.error({ err }, 'Failed to send audio data over HTTP');\n }\n },\n },\n { highWaterMark: 2 },\n { highWaterMark: 2 },\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,58 @@
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_cache_entry_exports = {};
20
+ __export(interruption_cache_entry_exports, {
21
+ InterruptionCacheEntry: () => InterruptionCacheEntry
22
+ });
23
+ module.exports = __toCommonJS(interruption_cache_entry_exports);
24
+ var import_utils = require("./utils.cjs");
25
+ class InterruptionCacheEntry {
26
+ createdAt;
27
+ requestStartedAt;
28
+ totalDurationInS;
29
+ predictionDurationInS;
30
+ detectionDelayInS;
31
+ speechInput;
32
+ probabilities;
33
+ isInterruption;
34
+ constructor(params) {
35
+ this.createdAt = params.createdAt;
36
+ this.requestStartedAt = params.requestStartedAt;
37
+ this.totalDurationInS = params.totalDurationInS ?? 0;
38
+ this.predictionDurationInS = params.predictionDurationInS ?? 0;
39
+ this.detectionDelayInS = params.detectionDelayInS ?? 0;
40
+ this.speechInput = params.speechInput;
41
+ this.probabilities = params.probabilities;
42
+ this.isInterruption = params.isInterruption;
43
+ }
44
+ /**
45
+ * The conservative estimated probability of the interruption event.
46
+ */
47
+ get probability() {
48
+ return this.probabilities ? (0, import_utils.estimateProbability)(this.probabilities) : 0;
49
+ }
50
+ static default() {
51
+ return new InterruptionCacheEntry({ createdAt: 0 });
52
+ }
53
+ }
54
+ // Annotate the CommonJS export names for ESM import in node:
55
+ 0 && (module.exports = {
56
+ InterruptionCacheEntry
57
+ });
58
+ //# sourceMappingURL=interruption_cache_entry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/interruption_cache_entry.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { estimateProbability } from './utils.js';\n\n/**\n * Typed cache entry for interruption inference results.\n * Mutable to support setOrUpdate pattern from Python's _BoundedCache.\n */\nexport class InterruptionCacheEntry {\n createdAt: number;\n requestStartedAt?: number;\n totalDurationInS: number;\n predictionDurationInS: number;\n detectionDelayInS: number;\n speechInput?: Int16Array;\n probabilities?: number[];\n isInterruption?: boolean;\n\n constructor(params: {\n createdAt: number;\n requestStartedAt?: number;\n speechInput?: Int16Array;\n totalDurationInS?: number;\n predictionDurationInS?: number;\n detectionDelayInS?: number;\n probabilities?: number[];\n isInterruption?: boolean;\n }) {\n this.createdAt = params.createdAt;\n this.requestStartedAt = params.requestStartedAt;\n this.totalDurationInS = params.totalDurationInS ?? 0;\n this.predictionDurationInS = params.predictionDurationInS ?? 0;\n this.detectionDelayInS = params.detectionDelayInS ?? 0;\n this.speechInput = params.speechInput;\n this.probabilities = params.probabilities;\n this.isInterruption = params.isInterruption;\n }\n\n /**\n * The conservative estimated probability of the interruption event.\n */\n get probability(): number {\n return this.probabilities ? estimateProbability(this.probabilities) : 0;\n }\n\n static default(): InterruptionCacheEntry {\n return new InterruptionCacheEntry({ createdAt: 0 });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAoC;AAM7B,MAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAST;AACD,SAAK,YAAY,OAAO;AACxB,SAAK,mBAAmB,OAAO;AAC/B,SAAK,mBAAmB,OAAO,oBAAoB;AACnD,SAAK,wBAAwB,OAAO,yBAAyB;AAC7D,SAAK,oBAAoB,OAAO,qBAAqB;AACrD,SAAK,cAAc,OAAO;AAC1B,SAAK,gBAAgB,OAAO;AAC5B,SAAK,iBAAiB,OAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK,oBAAgB,kCAAoB,KAAK,aAAa,IAAI;AAAA,EACxE;AAAA,EAEA,OAAO,UAAkC;AACvC,WAAO,IAAI,uBAAuB,EAAE,WAAW,EAAE,CAAC;AAAA,EACpD;AACF;","names":[]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Typed cache entry for interruption inference results.
3
+ * Mutable to support setOrUpdate pattern from Python's _BoundedCache.
4
+ */
5
+ export declare class InterruptionCacheEntry {
6
+ createdAt: number;
7
+ requestStartedAt?: number;
8
+ totalDurationInS: number;
9
+ predictionDurationInS: number;
10
+ detectionDelayInS: number;
11
+ speechInput?: Int16Array;
12
+ probabilities?: number[];
13
+ isInterruption?: boolean;
14
+ constructor(params: {
15
+ createdAt: number;
16
+ requestStartedAt?: number;
17
+ speechInput?: Int16Array;
18
+ totalDurationInS?: number;
19
+ predictionDurationInS?: number;
20
+ detectionDelayInS?: number;
21
+ probabilities?: number[];
22
+ isInterruption?: boolean;
23
+ });
24
+ /**
25
+ * The conservative estimated probability of the interruption event.
26
+ */
27
+ get probability(): number;
28
+ static default(): InterruptionCacheEntry;
29
+ }
30
+ //# sourceMappingURL=interruption_cache_entry.d.ts.map
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Typed cache entry for interruption inference results.
3
+ * Mutable to support setOrUpdate pattern from Python's _BoundedCache.
4
+ */
5
+ export declare class InterruptionCacheEntry {
6
+ createdAt: number;
7
+ requestStartedAt?: number;
8
+ totalDurationInS: number;
9
+ predictionDurationInS: number;
10
+ detectionDelayInS: number;
11
+ speechInput?: Int16Array;
12
+ probabilities?: number[];
13
+ isInterruption?: boolean;
14
+ constructor(params: {
15
+ createdAt: number;
16
+ requestStartedAt?: number;
17
+ speechInput?: Int16Array;
18
+ totalDurationInS?: number;
19
+ predictionDurationInS?: number;
20
+ detectionDelayInS?: number;
21
+ probabilities?: number[];
22
+ isInterruption?: boolean;
23
+ });
24
+ /**
25
+ * The conservative estimated probability of the interruption event.
26
+ */
27
+ get probability(): number;
28
+ static default(): InterruptionCacheEntry;
29
+ }
30
+ //# sourceMappingURL=interruption_cache_entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interruption_cache_entry.d.ts","sourceRoot":"","sources":["../../../src/inference/interruption/interruption_cache_entry.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,UAAU,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAWD;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,MAAM,CAAC,OAAO,IAAI,sBAAsB;CAGzC"}
@@ -0,0 +1,34 @@
1
+ import { estimateProbability } from "./utils.js";
2
+ class InterruptionCacheEntry {
3
+ createdAt;
4
+ requestStartedAt;
5
+ totalDurationInS;
6
+ predictionDurationInS;
7
+ detectionDelayInS;
8
+ speechInput;
9
+ probabilities;
10
+ isInterruption;
11
+ constructor(params) {
12
+ this.createdAt = params.createdAt;
13
+ this.requestStartedAt = params.requestStartedAt;
14
+ this.totalDurationInS = params.totalDurationInS ?? 0;
15
+ this.predictionDurationInS = params.predictionDurationInS ?? 0;
16
+ this.detectionDelayInS = params.detectionDelayInS ?? 0;
17
+ this.speechInput = params.speechInput;
18
+ this.probabilities = params.probabilities;
19
+ this.isInterruption = params.isInterruption;
20
+ }
21
+ /**
22
+ * The conservative estimated probability of the interruption event.
23
+ */
24
+ get probability() {
25
+ return this.probabilities ? estimateProbability(this.probabilities) : 0;
26
+ }
27
+ static default() {
28
+ return new InterruptionCacheEntry({ createdAt: 0 });
29
+ }
30
+ }
31
+ export {
32
+ InterruptionCacheEntry
33
+ };
34
+ //# sourceMappingURL=interruption_cache_entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/inference/interruption/interruption_cache_entry.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { estimateProbability } from './utils.js';\n\n/**\n * Typed cache entry for interruption inference results.\n * Mutable to support setOrUpdate pattern from Python's _BoundedCache.\n */\nexport class InterruptionCacheEntry {\n createdAt: number;\n requestStartedAt?: number;\n totalDurationInS: number;\n predictionDurationInS: number;\n detectionDelayInS: number;\n speechInput?: Int16Array;\n probabilities?: number[];\n isInterruption?: boolean;\n\n constructor(params: {\n createdAt: number;\n requestStartedAt?: number;\n speechInput?: Int16Array;\n totalDurationInS?: number;\n predictionDurationInS?: number;\n detectionDelayInS?: number;\n probabilities?: number[];\n isInterruption?: boolean;\n }) {\n this.createdAt = params.createdAt;\n this.requestStartedAt = params.requestStartedAt;\n this.totalDurationInS = params.totalDurationInS ?? 0;\n this.predictionDurationInS = params.predictionDurationInS ?? 0;\n this.detectionDelayInS = params.detectionDelayInS ?? 0;\n this.speechInput = params.speechInput;\n this.probabilities = params.probabilities;\n this.isInterruption = params.isInterruption;\n }\n\n /**\n * The conservative estimated probability of the interruption event.\n */\n get probability(): number {\n return this.probabilities ? estimateProbability(this.probabilities) : 0;\n }\n\n static default(): InterruptionCacheEntry {\n return new InterruptionCacheEntry({ createdAt: 0 });\n }\n}\n"],"mappings":"AAGA,SAAS,2BAA2B;AAM7B,MAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAST;AACD,SAAK,YAAY,OAAO;AACxB,SAAK,mBAAmB,OAAO;AAC/B,SAAK,mBAAmB,OAAO,oBAAoB;AACnD,SAAK,wBAAwB,OAAO,yBAAyB;AAC7D,SAAK,oBAAoB,OAAO,qBAAqB;AACrD,SAAK,cAAc,OAAO;AAC1B,SAAK,gBAAgB,OAAO;AAC5B,SAAK,iBAAiB,OAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK,gBAAgB,oBAAoB,KAAK,aAAa,IAAI;AAAA,EACxE;AAAA,EAEA,OAAO,UAAkC;AACvC,WAAO,IAAI,uBAAuB,EAAE,WAAW,EAAE,CAAC;AAAA,EACpD;AACF;","names":[]}