@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
@@ -17,12 +17,15 @@ import {
17
17
  type STTModelString,
18
18
  type TTSModelString,
19
19
  } from '../inference/index.js';
20
+ import type { InterruptionDetectionError } from '../inference/interruption/errors.js';
21
+ import type { OverlappingSpeechEvent } from '../inference/interruption/types.js';
20
22
  import { type JobContext, getJobContext } from '../job.js';
21
23
  import type { FunctionCall, FunctionCallOutput } from '../llm/chat_context.js';
22
24
  import { AgentHandoffItem, ChatContext, ChatMessage } from '../llm/chat_context.js';
23
25
  import type { LLM, RealtimeModel, RealtimeModelError, ToolChoice } from '../llm/index.js';
24
26
  import type { LLMError } from '../llm/llm.js';
25
27
  import { log } from '../log.js';
28
+ import { type ModelUsage, ModelUsageCollector, filterZeroValues } from '../metrics/model_usage.js';
26
29
  import type { STT } from '../stt/index.js';
27
30
  import type { STTError } from '../stt/stt.js';
28
31
  import { traceTypes, tracer } from '../telemetry/index.js';
@@ -38,6 +41,7 @@ import type { VAD } from '../vad.js';
38
41
  import type { Agent } from './agent.js';
39
42
  import { AgentActivity } from './agent_activity.js';
40
43
  import type { _TurnDetector } from './audio_recognition.js';
44
+ import { ClientEventsHandler } from './client_events.js';
41
45
  import {
42
46
  type AgentEvent,
43
47
  AgentSessionEventTypes,
@@ -61,37 +65,90 @@ import {
61
65
  } from './events.js';
62
66
  import { AgentInput, AgentOutput } from './io.js';
63
67
  import { RecorderIO } from './recorder_io/index.js';
64
- import { RoomIO, type RoomInputOptions, type RoomOutputOptions } from './room_io/index.js';
68
+ import {
69
+ DEFAULT_TEXT_INPUT_CALLBACK,
70
+ RoomIO,
71
+ type RoomInputOptions,
72
+ type RoomOutputOptions,
73
+ } from './room_io/index.js';
65
74
  import type { UnknownUserData } from './run_context.js';
66
75
  import type { SpeechHandle } from './speech_handle.js';
67
76
  import { RunResult } from './testing/run_result.js';
77
+ import type { InterruptionOptions } from './turn_config/interruption.js';
78
+ import type {
79
+ InternalTurnHandlingOptions,
80
+ TurnHandlingOptions,
81
+ } from './turn_config/turn_handling.js';
82
+ import { migrateLegacyOptions } from './turn_config/utils.js';
68
83
  import { setParticipantSpanAttributes } from './utils.js';
69
84
 
70
- export interface VoiceOptions {
71
- allowInterruptions: boolean;
72
- discardAudioIfUninterruptible: boolean;
73
- minInterruptionDuration: number;
74
- minInterruptionWords: number;
75
- minEndpointingDelay: number;
76
- maxEndpointingDelay: number;
85
+ export interface AgentSessionUsage {
86
+ /** List of usage summaries, one per model/provider combination. */
87
+ modelUsage: Array<Partial<ModelUsage>>;
88
+ }
89
+
90
+ export interface SessionOptions {
77
91
  maxToolSteps: number;
92
+ /**
93
+ * Whether to speculatively begin LLM and TTS requests before an end-of-turn is detected.
94
+ * When `true`, the agent sends inference calls as soon as a user transcript is received rather
95
+ * than waiting for a definitive turn boundary. This can reduce response latency by overlapping
96
+ * model inference with user audio, but may incur extra compute if the user interrupts or
97
+ * revises mid-utterance.
98
+ * @defaultValue false
99
+ */
78
100
  preemptiveGeneration: boolean;
79
- userAwayTimeout?: number | null;
101
+
102
+ /**
103
+ * If set, set the user state as "away" after this amount of time after user and agent are
104
+ * silent. Set to `null` to disable.
105
+ * @defaultValue 15.0
106
+ */
107
+ userAwayTimeout: number | null;
108
+
109
+ /**
110
+ * Duration in milliseconds for AEC (Acoustic Echo Cancellation) warmup, during which
111
+ * interruptions from audio activity are suppressed. Set to `null` to disable.
112
+ * @defaultValue 3000
113
+ */
114
+ aecWarmupDuration: number | null;
115
+
116
+ /**
117
+ * Configuration for turn handling.
118
+ */
119
+ turnHandling: Partial<TurnHandlingOptions>;
120
+
80
121
  useTtsAlignedTranscript: boolean;
122
+
123
+ /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.mode instead. */
124
+ allowInterruptions?: boolean;
125
+ /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.discardAudioIfUninterruptible instead. */
126
+ discardAudioIfUninterruptible?: boolean;
127
+ /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.minDuration instead. */
128
+ minInterruptionDuration?: number;
129
+ /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.minWords instead. */
130
+ minInterruptionWords?: number;
131
+ /** @deprecated Use {@link SessionOptions.turnHandling}.endpointing.minDelay instead. */
132
+ minEndpointingDelay?: number;
133
+ /** @deprecated Use {@link SessionOptions.turnHandling}.endpointing.maxDelay instead. */
134
+ maxEndpointingDelay?: number;
135
+ }
136
+
137
+ export interface InternalSessionOptions extends SessionOptions {
138
+ turnHandling: InternalTurnHandlingOptions;
81
139
  }
82
140
 
83
- const defaultVoiceOptions: VoiceOptions = {
84
- allowInterruptions: true,
85
- discardAudioIfUninterruptible: true,
86
- minInterruptionDuration: 500,
87
- minInterruptionWords: 0,
88
- minEndpointingDelay: 500,
89
- maxEndpointingDelay: 6000,
141
+ export const defaultSessionOptions = {
90
142
  maxToolSteps: 3,
91
143
  preemptiveGeneration: false,
92
144
  userAwayTimeout: 15.0,
145
+ aecWarmupDuration: 3000,
146
+ turnHandling: {},
93
147
  useTtsAlignedTranscript: true,
94
- } as const;
148
+ } as const satisfies SessionOptions;
149
+
150
+ /** @deprecated {@link VoiceOptions} has been renamed to {@link SessionOptions} */
151
+ export type VoiceOptions = SessionOptions;
95
152
 
96
153
  export type TurnDetectionMode = 'stt' | 'vad' | 'realtime_llm' | 'manual' | _TurnDetector;
97
154
 
@@ -105,17 +162,22 @@ export type AgentSessionCallbacks = {
105
162
  [AgentSessionEventTypes.SpeechCreated]: (ev: SpeechCreatedEvent) => void;
106
163
  [AgentSessionEventTypes.Error]: (ev: ErrorEvent) => void;
107
164
  [AgentSessionEventTypes.Close]: (ev: CloseEvent) => void;
165
+ [AgentSessionEventTypes.UserOverlappingSpeech]: (ev: OverlappingSpeechEvent) => void;
108
166
  };
109
167
 
110
168
  export type AgentSessionOptions<UserData = UnknownUserData> = {
111
- turnDetection?: TurnDetectionMode;
112
169
  stt?: STT | STTModelString;
113
170
  vad?: VAD;
114
171
  llm?: LLM | RealtimeModel | LLMModels;
115
172
  tts?: TTS | TTSModelString;
116
173
  userData?: UserData;
117
- voiceOptions?: Partial<VoiceOptions>;
174
+ options?: Partial<SessionOptions>;
118
175
  connOptions?: SessionConnectOptions;
176
+
177
+ /** @deprecated use {@link AgentSessionOptions.options}.turnHandling.turnDetection instead */
178
+ turnDetection?: TurnDetectionMode;
179
+ /** @deprecated use {@link AgentSessionOptions.options} instead */
180
+ voiceOptions?: Partial<VoiceOptions>;
119
181
  };
120
182
 
121
183
  type ActivityTransitionOptions = {
@@ -134,22 +196,19 @@ export class AgentSession<
134
196
  tts?: TTS;
135
197
  turnDetection?: TurnDetectionMode;
136
198
 
137
- readonly options: VoiceOptions;
199
+ readonly options: InternalSessionOptions;
200
+ private readonly activityLock = new Mutex();
138
201
 
139
202
  private agent?: Agent;
140
203
  private activity?: AgentActivity;
141
204
  private nextActivity?: AgentActivity;
142
205
  private updateActivityTask?: Task<void>;
143
206
  private started = false;
144
- private userState: UserState = 'listening';
145
- private readonly activityLock = new Mutex();
146
-
147
- /** @internal */
148
- _roomIO?: RoomIO;
149
- private logger = log();
207
+ private clientEventsHandler?: ClientEventsHandler;
150
208
 
151
209
  private _chatCtx: ChatContext;
152
210
  private _userData: UserData | undefined;
211
+ private _userState: UserState = 'listening';
153
212
  private _agentState: AgentState = 'initializing';
154
213
 
155
214
  private _input: AgentInput;
@@ -158,17 +217,29 @@ export class AgentSession<
158
217
  private closingTask: Promise<void> | null = null;
159
218
  private userAwayTimer: NodeJS.Timeout | null = null;
160
219
 
220
+ private _aecWarmupTimer: NodeJS.Timeout | null = null;
221
+
161
222
  // Connection options for STT, LLM, and TTS
162
223
  private _connOptions: ResolvedSessionConnectOptions;
163
224
 
164
225
  // Unrecoverable error counts, reset after agent speaking
165
226
  private llmErrorCounts = 0;
166
227
  private ttsErrorCounts = 0;
228
+ private interruptionDetectionErrorCounts = 0;
167
229
 
168
230
  private sessionSpan?: Span;
169
- private userSpeakingSpan?: Span;
170
231
  private agentSpeakingSpan?: Span;
171
232
 
233
+ private _interruptionDetection?: InterruptionOptions['mode'];
234
+
235
+ private _usageCollector: ModelUsageCollector = new ModelUsageCollector();
236
+
237
+ /** @internal */
238
+ _roomIO?: RoomIO;
239
+
240
+ /** @internal */
241
+ _aecWarmupRemaining = 0;
242
+
172
243
  /** @internal */
173
244
  _recorderIO?: RecorderIO;
174
245
 
@@ -187,20 +258,17 @@ export class AgentSession<
187
258
  /** @internal - Current run state for testing */
188
259
  _globalRunState?: RunResult;
189
260
 
190
- constructor(opts: AgentSessionOptions<UserData>) {
261
+ /** @internal */
262
+ _userSpeakingSpan?: Span;
263
+
264
+ private logger = log();
265
+
266
+ constructor(options: AgentSessionOptions<UserData>) {
191
267
  super();
192
268
 
193
- const {
194
- vad,
195
- stt,
196
- llm,
197
- tts,
198
- turnDetection,
199
- userData,
200
- voiceOptions = defaultVoiceOptions,
201
- connOptions,
202
- } = opts;
269
+ const opts = migrateLegacyOptions<UserData>(options);
203
270
 
271
+ const { vad, stt, llm, tts, userData, connOptions, options: sessionOptions } = opts;
204
272
  // Merge user-provided connOptions with defaults
205
273
  this._connOptions = {
206
274
  sttConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.sttConnOptions },
@@ -231,7 +299,8 @@ export class AgentSession<
231
299
  this.tts = tts;
232
300
  }
233
301
 
234
- this.turnDetection = turnDetection;
302
+ this.turnDetection = sessionOptions?.turnHandling?.turnDetection;
303
+ this._interruptionDetection = sessionOptions?.turnHandling?.interruption?.mode;
235
304
  this._userData = userData;
236
305
 
237
306
  // configurable IO
@@ -240,7 +309,8 @@ export class AgentSession<
240
309
 
241
310
  // This is the "global" chat context, it holds the entire conversation history
242
311
  this._chatCtx = ChatContext.empty();
243
- this.options = { ...defaultVoiceOptions, ...voiceOptions };
312
+ this.options = opts.options;
313
+ this._aecWarmupRemaining = this.options.aecWarmupDuration ?? 0;
244
314
 
245
315
  this._onUserInputTranscribed = this._onUserInputTranscribed.bind(this);
246
316
  this.on(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);
@@ -252,6 +322,9 @@ export class AgentSession<
252
322
  ): boolean {
253
323
  const eventData = args[0] as AgentEvent;
254
324
  this._recordedEvents.push(eventData);
325
+ if (event === AgentSessionEventTypes.MetricsCollected) {
326
+ this._usageCollector.collect((eventData as MetricsCollectedEvent).metrics);
327
+ }
255
328
  return super.emit(event, ...args);
256
329
  }
257
330
 
@@ -280,6 +353,18 @@ export class AgentSession<
280
353
  return this._connOptions;
281
354
  }
282
355
 
356
+ get interruptionDetection() {
357
+ return this._interruptionDetection;
358
+ }
359
+
360
+ /**
361
+ * Returns usage summaries for this session, one per model/provider combination.
362
+ */
363
+ get usage(): AgentSessionUsage {
364
+ // Skip zero fields for more concise usage display (matches python behavior).
365
+ return { modelUsage: this._usageCollector.flatten().map(filterZeroValues) };
366
+ }
367
+
283
368
  get useTtsAlignedTranscript(): boolean {
284
369
  return this.options.useTtsAlignedTranscript;
285
370
  }
@@ -334,7 +419,15 @@ export class AgentSession<
334
419
  inputOptions,
335
420
  outputOptions,
336
421
  });
422
+
337
423
  this._roomIO.start();
424
+
425
+ this.clientEventsHandler = new ClientEventsHandler(this, this._roomIO);
426
+ if (inputOptions?.textEnabled !== false) {
427
+ this.clientEventsHandler.registerTextInput(
428
+ inputOptions?.textInputCallback ?? DEFAULT_TEXT_INPUT_CALLBACK,
429
+ );
430
+ }
338
431
  }
339
432
 
340
433
  let ctx: JobContext | undefined = undefined;
@@ -377,6 +470,10 @@ export class AgentSession<
377
470
 
378
471
  await Promise.allSettled(tasks);
379
472
 
473
+ if (this.clientEventsHandler) {
474
+ await this.clientEventsHandler.start();
475
+ }
476
+
380
477
  // Log used IO configuration
381
478
  this.logger.debug(
382
479
  `using audio io: ${this.input.audio ? '`' + this.input.audio.constructor.name + '`' : '(none)'} -> \`AgentSession\` -> ${this.output.audio ? '`' + this.output.audio.constructor.name + '`' : '(none)'}`,
@@ -408,6 +505,8 @@ export class AgentSession<
408
505
  return;
409
506
  }
410
507
 
508
+ this._usageCollector = new ModelUsageCollector();
509
+
411
510
  let ctx: JobContext | undefined = undefined;
412
511
  try {
413
512
  ctx = getJobContext();
@@ -740,6 +839,10 @@ export class AgentSession<
740
839
  return this._agentState;
741
840
  }
742
841
 
842
+ get userState(): UserState {
843
+ return this._userState;
844
+ }
845
+
743
846
  get currentAgent(): Agent {
744
847
  if (!this.agent) {
745
848
  throw new Error('AgentSession is not running');
@@ -778,7 +881,9 @@ export class AgentSession<
778
881
  }
779
882
 
780
883
  /** @internal */
781
- _onError(error: RealtimeModelError | STTError | TTSError | LLMError): void {
884
+ _onError(
885
+ error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError,
886
+ ): void {
782
887
  if (this.closingTask || error.recoverable) {
783
888
  return;
784
889
  }
@@ -794,6 +899,11 @@ export class AgentSession<
794
899
  if (this.ttsErrorCounts <= this._connOptions.maxUnrecoverableErrors) {
795
900
  return;
796
901
  }
902
+ } else if (error.type === 'interruption_detection_error') {
903
+ this.interruptionDetectionErrorCounts += 1;
904
+ if (this.interruptionDetectionErrorCounts <= this._connOptions.maxUnrecoverableErrors) {
905
+ return;
906
+ }
797
907
  }
798
908
 
799
909
  this.logger.error(error, 'AgentSession is closing due to unrecoverable error');
@@ -823,9 +933,9 @@ export class AgentSession<
823
933
  }
824
934
 
825
935
  if (state === 'speaking') {
826
- // Reset error counts when agent starts speaking
827
936
  this.llmErrorCounts = 0;
828
937
  this.ttsErrorCounts = 0;
938
+ this.interruptionDetectionErrorCounts = 0;
829
939
 
830
940
  if (this.agentSpeakingSpan === undefined) {
831
941
  this.agentSpeakingSpan = tracer.startSpan({
@@ -845,11 +955,19 @@ export class AgentSession<
845
955
  this.agentSpeakingSpan = undefined;
846
956
  }
847
957
 
958
+ if (state === 'speaking' && this._aecWarmupRemaining > 0 && this._aecWarmupTimer === null) {
959
+ this._aecWarmupTimer = setTimeout(() => this._onAecWarmupExpired(), this._aecWarmupRemaining);
960
+ this.logger.debug(
961
+ { warmupDurationMs: this._aecWarmupRemaining },
962
+ 'aec warmup active, disabling interruptions',
963
+ );
964
+ }
965
+
848
966
  const oldState = this._agentState;
849
967
  this._agentState = state;
850
968
 
851
969
  // Handle user away timer based on state changes
852
- if (state === 'listening' && this.userState === 'listening') {
970
+ if (state === 'listening' && this._userState === 'listening') {
853
971
  this._setUserAwayTimer();
854
972
  } else {
855
973
  this._cancelUserAwayTimer();
@@ -863,12 +981,12 @@ export class AgentSession<
863
981
 
864
982
  /** @internal */
865
983
  _updateUserState(state: UserState, lastSpeakingTime?: number) {
866
- if (this.userState === state) {
984
+ if (this._userState === state) {
867
985
  return;
868
986
  }
869
987
 
870
- if (state === 'speaking' && this.userSpeakingSpan === undefined) {
871
- this.userSpeakingSpan = tracer.startSpan({
988
+ if (state === 'speaking' && this._userSpeakingSpan === undefined) {
989
+ this._userSpeakingSpan = tracer.startSpan({
872
990
  name: 'user_speaking',
873
991
  context: this.rootSpanContext,
874
992
  startTime: lastSpeakingTime,
@@ -876,15 +994,15 @@ export class AgentSession<
876
994
 
877
995
  const linked = this._roomIO?.linkedParticipant;
878
996
  if (linked) {
879
- setParticipantSpanAttributes(this.userSpeakingSpan, linked);
997
+ setParticipantSpanAttributes(this._userSpeakingSpan, linked);
880
998
  }
881
- } else if (this.userSpeakingSpan !== undefined) {
882
- this.userSpeakingSpan.end(lastSpeakingTime);
883
- this.userSpeakingSpan = undefined;
999
+ } else if (this._userSpeakingSpan !== undefined) {
1000
+ this._userSpeakingSpan.end(lastSpeakingTime);
1001
+ this._userSpeakingSpan = undefined;
884
1002
  }
885
1003
 
886
- const oldState = this.userState;
887
- this.userState = state;
1004
+ const oldState = this._userState;
1005
+ this._userState = state;
888
1006
 
889
1007
  // Handle user away timer based on state changes
890
1008
  if (state === 'listening' && this._agentState === 'listening') {
@@ -938,8 +1056,21 @@ export class AgentSession<
938
1056
  }
939
1057
  }
940
1058
 
1059
+ /** @internal */
1060
+ _onAecWarmupExpired(): void {
1061
+ if (this._aecWarmupRemaining > 0) {
1062
+ this.logger.debug('aec warmup expired, re-enabling interruptions');
1063
+ }
1064
+
1065
+ this._aecWarmupRemaining = 0;
1066
+ if (this._aecWarmupTimer !== null) {
1067
+ clearTimeout(this._aecWarmupTimer);
1068
+ this._aecWarmupTimer = null;
1069
+ }
1070
+ }
1071
+
941
1072
  private _onUserInputTranscribed(ev: UserInputTranscribedEvent): void {
942
- if (this.userState === 'away' && ev.isFinal) {
1073
+ if (this._userState === 'away' && ev.isFinal) {
943
1074
  this.logger.debug('User returned from away state due to speech input');
944
1075
  this._updateUserState('listening');
945
1076
  }
@@ -947,7 +1078,13 @@ export class AgentSession<
947
1078
 
948
1079
  private async closeImpl(
949
1080
  reason: ShutdownReason,
950
- error: RealtimeModelError | LLMError | TTSError | STTError | null = null,
1081
+ error:
1082
+ | RealtimeModelError
1083
+ | LLMError
1084
+ | TTSError
1085
+ | STTError
1086
+ | InterruptionDetectionError
1087
+ | null = null,
951
1088
  drain: boolean = false,
952
1089
  ): Promise<void> {
953
1090
  if (this.rootSpanContext) {
@@ -961,7 +1098,13 @@ export class AgentSession<
961
1098
 
962
1099
  private async closeImplInner(
963
1100
  reason: ShutdownReason,
964
- error: RealtimeModelError | LLMError | TTSError | STTError | null = null,
1101
+ error:
1102
+ | RealtimeModelError
1103
+ | LLMError
1104
+ | TTSError
1105
+ | STTError
1106
+ | InterruptionDetectionError
1107
+ | null = null,
965
1108
  drain: boolean = false,
966
1109
  ): Promise<void> {
967
1110
  if (!this.started) {
@@ -969,6 +1112,7 @@ export class AgentSession<
969
1112
  }
970
1113
 
971
1114
  this._cancelUserAwayTimer();
1115
+ this._onAecWarmupExpired();
972
1116
  this.off(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);
973
1117
 
974
1118
  if (this.activity) {
@@ -1006,6 +1150,9 @@ export class AgentSession<
1006
1150
  this.output.audio = null;
1007
1151
  this.output.transcription = null;
1008
1152
 
1153
+ await this.clientEventsHandler?.close();
1154
+ this.clientEventsHandler = undefined;
1155
+
1009
1156
  await this._roomIO?.close();
1010
1157
  this._roomIO = undefined;
1011
1158
 
@@ -1017,9 +1164,9 @@ export class AgentSession<
1017
1164
  this.sessionSpan = undefined;
1018
1165
  }
1019
1166
 
1020
- if (this.userSpeakingSpan) {
1021
- this.userSpeakingSpan.end();
1022
- this.userSpeakingSpan = undefined;
1167
+ if (this._userSpeakingSpan) {
1168
+ this._userSpeakingSpan.end();
1169
+ this._userSpeakingSpan = undefined;
1023
1170
  }
1024
1171
 
1025
1172
  if (this.agentSpeakingSpan) {
@@ -1031,11 +1178,12 @@ export class AgentSession<
1031
1178
 
1032
1179
  this.emit(AgentSessionEventTypes.Close, createCloseEvent(reason, error));
1033
1180
 
1034
- this.userState = 'listening';
1181
+ this._userState = 'listening';
1035
1182
  this._agentState = 'initializing';
1036
1183
  this.rootSpanContext = undefined;
1037
1184
  this.llmErrorCounts = 0;
1038
1185
  this.ttsErrorCounts = 0;
1186
+ this.interruptionDetectionErrorCounts = 0;
1039
1187
 
1040
1188
  this.logger.info({ reason, error }, 'AgentSession closed');
1041
1189
  }