@livekit/agents 1.0.48 → 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 (373) hide show
  1. package/dist/constants.cjs +27 -0
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.cts +9 -0
  4. package/dist/constants.d.ts +9 -0
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +18 -0
  7. package/dist/constants.js.map +1 -1
  8. package/dist/inference/api_protos.d.cts +71 -71
  9. package/dist/inference/api_protos.d.ts +71 -71
  10. package/dist/inference/interruption/defaults.cjs +81 -0
  11. package/dist/inference/interruption/defaults.cjs.map +1 -0
  12. package/dist/inference/interruption/defaults.d.cts +19 -0
  13. package/dist/inference/interruption/defaults.d.ts +19 -0
  14. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  15. package/dist/inference/interruption/defaults.js +46 -0
  16. package/dist/inference/interruption/defaults.js.map +1 -0
  17. package/dist/inference/interruption/errors.cjs +44 -0
  18. package/dist/inference/interruption/errors.cjs.map +1 -0
  19. package/dist/inference/interruption/errors.d.cts +12 -0
  20. package/dist/inference/interruption/errors.d.ts +12 -0
  21. package/dist/inference/interruption/errors.d.ts.map +1 -0
  22. package/dist/inference/interruption/errors.js +20 -0
  23. package/dist/inference/interruption/errors.js.map +1 -0
  24. package/dist/inference/interruption/http_transport.cjs +147 -0
  25. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  26. package/dist/inference/interruption/http_transport.d.cts +63 -0
  27. package/dist/inference/interruption/http_transport.d.ts +63 -0
  28. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  29. package/dist/inference/interruption/http_transport.js +121 -0
  30. package/dist/inference/interruption/http_transport.js.map +1 -0
  31. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  32. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  33. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  34. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  35. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  36. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  37. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  38. package/dist/inference/interruption/interruption_detector.cjs +181 -0
  39. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  40. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  41. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  42. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  43. package/dist/inference/interruption/interruption_detector.js +147 -0
  44. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  45. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  46. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  47. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  48. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  49. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  50. package/dist/inference/interruption/interruption_stream.js +344 -0
  51. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  52. package/dist/inference/interruption/types.cjs +17 -0
  53. package/dist/inference/interruption/types.cjs.map +1 -0
  54. package/dist/inference/interruption/types.d.cts +66 -0
  55. package/dist/inference/interruption/types.d.ts +66 -0
  56. package/dist/inference/interruption/types.d.ts.map +1 -0
  57. package/dist/inference/interruption/types.js +1 -0
  58. package/dist/inference/interruption/types.js.map +1 -0
  59. package/dist/inference/interruption/utils.cjs +130 -0
  60. package/dist/inference/interruption/utils.cjs.map +1 -0
  61. package/dist/inference/interruption/utils.d.cts +41 -0
  62. package/dist/inference/interruption/utils.d.ts +41 -0
  63. package/dist/inference/interruption/utils.d.ts.map +1 -0
  64. package/dist/inference/interruption/utils.js +105 -0
  65. package/dist/inference/interruption/utils.js.map +1 -0
  66. package/dist/inference/interruption/utils.test.cjs +105 -0
  67. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  68. package/dist/inference/interruption/utils.test.js +104 -0
  69. package/dist/inference/interruption/utils.test.js.map +1 -0
  70. package/dist/inference/interruption/ws_transport.cjs +329 -0
  71. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  72. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  73. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  74. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  75. package/dist/inference/interruption/ws_transport.js +295 -0
  76. package/dist/inference/interruption/ws_transport.js.map +1 -0
  77. package/dist/inference/llm.cjs +14 -10
  78. package/dist/inference/llm.cjs.map +1 -1
  79. package/dist/inference/llm.d.cts +2 -1
  80. package/dist/inference/llm.d.ts +2 -1
  81. package/dist/inference/llm.d.ts.map +1 -1
  82. package/dist/inference/llm.js +8 -10
  83. package/dist/inference/llm.js.map +1 -1
  84. package/dist/inference/stt.cjs +7 -2
  85. package/dist/inference/stt.cjs.map +1 -1
  86. package/dist/inference/stt.d.cts +2 -0
  87. package/dist/inference/stt.d.ts +2 -0
  88. package/dist/inference/stt.d.ts.map +1 -1
  89. package/dist/inference/stt.js +8 -3
  90. package/dist/inference/stt.js.map +1 -1
  91. package/dist/inference/tts.cjs +7 -2
  92. package/dist/inference/tts.cjs.map +1 -1
  93. package/dist/inference/tts.d.cts +2 -0
  94. package/dist/inference/tts.d.ts +2 -0
  95. package/dist/inference/tts.d.ts.map +1 -1
  96. package/dist/inference/tts.js +8 -3
  97. package/dist/inference/tts.js.map +1 -1
  98. package/dist/inference/utils.cjs +26 -7
  99. package/dist/inference/utils.cjs.map +1 -1
  100. package/dist/inference/utils.d.cts +13 -0
  101. package/dist/inference/utils.d.ts +13 -0
  102. package/dist/inference/utils.d.ts.map +1 -1
  103. package/dist/inference/utils.js +18 -2
  104. package/dist/inference/utils.js.map +1 -1
  105. package/dist/llm/chat_context.cjs +20 -2
  106. package/dist/llm/chat_context.cjs.map +1 -1
  107. package/dist/llm/chat_context.d.cts +19 -1
  108. package/dist/llm/chat_context.d.ts +19 -1
  109. package/dist/llm/chat_context.d.ts.map +1 -1
  110. package/dist/llm/chat_context.js +20 -2
  111. package/dist/llm/chat_context.js.map +1 -1
  112. package/dist/llm/index.cjs.map +1 -1
  113. package/dist/llm/index.d.cts +1 -1
  114. package/dist/llm/index.d.ts +1 -1
  115. package/dist/llm/index.d.ts.map +1 -1
  116. package/dist/llm/index.js.map +1 -1
  117. package/dist/llm/llm.cjs +16 -1
  118. package/dist/llm/llm.cjs.map +1 -1
  119. package/dist/llm/llm.d.cts +9 -0
  120. package/dist/llm/llm.d.ts +9 -0
  121. package/dist/llm/llm.d.ts.map +1 -1
  122. package/dist/llm/llm.js +16 -1
  123. package/dist/llm/llm.js.map +1 -1
  124. package/dist/llm/realtime.cjs +3 -0
  125. package/dist/llm/realtime.cjs.map +1 -1
  126. package/dist/llm/realtime.d.cts +1 -0
  127. package/dist/llm/realtime.d.ts +1 -0
  128. package/dist/llm/realtime.d.ts.map +1 -1
  129. package/dist/llm/realtime.js +3 -0
  130. package/dist/llm/realtime.js.map +1 -1
  131. package/dist/metrics/base.cjs.map +1 -1
  132. package/dist/metrics/base.d.cts +45 -1
  133. package/dist/metrics/base.d.ts +45 -1
  134. package/dist/metrics/base.d.ts.map +1 -1
  135. package/dist/metrics/index.cjs +5 -0
  136. package/dist/metrics/index.cjs.map +1 -1
  137. package/dist/metrics/index.d.cts +2 -1
  138. package/dist/metrics/index.d.ts +2 -1
  139. package/dist/metrics/index.d.ts.map +1 -1
  140. package/dist/metrics/index.js +6 -0
  141. package/dist/metrics/index.js.map +1 -1
  142. package/dist/metrics/model_usage.cjs +189 -0
  143. package/dist/metrics/model_usage.cjs.map +1 -0
  144. package/dist/metrics/model_usage.d.cts +92 -0
  145. package/dist/metrics/model_usage.d.ts +92 -0
  146. package/dist/metrics/model_usage.d.ts.map +1 -0
  147. package/dist/metrics/model_usage.js +164 -0
  148. package/dist/metrics/model_usage.js.map +1 -0
  149. package/dist/metrics/model_usage.test.cjs +474 -0
  150. package/dist/metrics/model_usage.test.cjs.map +1 -0
  151. package/dist/metrics/model_usage.test.js +476 -0
  152. package/dist/metrics/model_usage.test.js.map +1 -0
  153. package/dist/metrics/usage_collector.cjs +3 -0
  154. package/dist/metrics/usage_collector.cjs.map +1 -1
  155. package/dist/metrics/usage_collector.d.cts +9 -0
  156. package/dist/metrics/usage_collector.d.ts +9 -0
  157. package/dist/metrics/usage_collector.d.ts.map +1 -1
  158. package/dist/metrics/usage_collector.js +3 -0
  159. package/dist/metrics/usage_collector.js.map +1 -1
  160. package/dist/metrics/utils.cjs +9 -0
  161. package/dist/metrics/utils.cjs.map +1 -1
  162. package/dist/metrics/utils.d.ts.map +1 -1
  163. package/dist/metrics/utils.js +9 -0
  164. package/dist/metrics/utils.js.map +1 -1
  165. package/dist/stream/multi_input_stream.test.cjs +4 -0
  166. package/dist/stream/multi_input_stream.test.cjs.map +1 -1
  167. package/dist/stream/multi_input_stream.test.js +5 -1
  168. package/dist/stream/multi_input_stream.test.js.map +1 -1
  169. package/dist/stream/stream_channel.cjs +31 -0
  170. package/dist/stream/stream_channel.cjs.map +1 -1
  171. package/dist/stream/stream_channel.d.cts +4 -2
  172. package/dist/stream/stream_channel.d.ts +4 -2
  173. package/dist/stream/stream_channel.d.ts.map +1 -1
  174. package/dist/stream/stream_channel.js +31 -0
  175. package/dist/stream/stream_channel.js.map +1 -1
  176. package/dist/stt/stt.cjs +34 -2
  177. package/dist/stt/stt.cjs.map +1 -1
  178. package/dist/stt/stt.d.cts +22 -0
  179. package/dist/stt/stt.d.ts +22 -0
  180. package/dist/stt/stt.d.ts.map +1 -1
  181. package/dist/stt/stt.js +34 -2
  182. package/dist/stt/stt.js.map +1 -1
  183. package/dist/telemetry/otel_http_exporter.cjs +24 -5
  184. package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
  185. package/dist/telemetry/otel_http_exporter.d.cts +1 -0
  186. package/dist/telemetry/otel_http_exporter.d.ts +1 -0
  187. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
  188. package/dist/telemetry/otel_http_exporter.js +24 -5
  189. package/dist/telemetry/otel_http_exporter.js.map +1 -1
  190. package/dist/telemetry/trace_types.cjs +5 -5
  191. package/dist/telemetry/trace_types.cjs.map +1 -1
  192. package/dist/telemetry/trace_types.d.cts +9 -5
  193. package/dist/telemetry/trace_types.d.ts +9 -5
  194. package/dist/telemetry/trace_types.d.ts.map +1 -1
  195. package/dist/telemetry/trace_types.js +5 -5
  196. package/dist/telemetry/trace_types.js.map +1 -1
  197. package/dist/telemetry/traces.cjs +47 -8
  198. package/dist/telemetry/traces.cjs.map +1 -1
  199. package/dist/telemetry/traces.d.ts.map +1 -1
  200. package/dist/telemetry/traces.js +47 -8
  201. package/dist/telemetry/traces.js.map +1 -1
  202. package/dist/tts/tts.cjs +64 -2
  203. package/dist/tts/tts.cjs.map +1 -1
  204. package/dist/tts/tts.d.cts +34 -0
  205. package/dist/tts/tts.d.ts +34 -0
  206. package/dist/tts/tts.d.ts.map +1 -1
  207. package/dist/tts/tts.js +64 -2
  208. package/dist/tts/tts.js.map +1 -1
  209. package/dist/version.cjs +1 -1
  210. package/dist/version.js +1 -1
  211. package/dist/voice/agent.cjs +25 -4
  212. package/dist/voice/agent.cjs.map +1 -1
  213. package/dist/voice/agent.d.cts +10 -2
  214. package/dist/voice/agent.d.ts +10 -2
  215. package/dist/voice/agent.d.ts.map +1 -1
  216. package/dist/voice/agent.js +25 -4
  217. package/dist/voice/agent.js.map +1 -1
  218. package/dist/voice/agent_activity.cjs +261 -36
  219. package/dist/voice/agent_activity.cjs.map +1 -1
  220. package/dist/voice/agent_activity.d.cts +20 -6
  221. package/dist/voice/agent_activity.d.ts +20 -6
  222. package/dist/voice/agent_activity.d.ts.map +1 -1
  223. package/dist/voice/agent_activity.js +262 -37
  224. package/dist/voice/agent_activity.js.map +1 -1
  225. package/dist/voice/agent_session.cjs +105 -48
  226. package/dist/voice/agent_session.cjs.map +1 -1
  227. package/dist/voice/agent_session.d.cts +90 -20
  228. package/dist/voice/agent_session.d.ts +90 -20
  229. package/dist/voice/agent_session.d.ts.map +1 -1
  230. package/dist/voice/agent_session.js +105 -46
  231. package/dist/voice/agent_session.js.map +1 -1
  232. package/dist/voice/audio_recognition.cjs +287 -6
  233. package/dist/voice/audio_recognition.cjs.map +1 -1
  234. package/dist/voice/audio_recognition.d.cts +42 -3
  235. package/dist/voice/audio_recognition.d.ts +42 -3
  236. package/dist/voice/audio_recognition.d.ts.map +1 -1
  237. package/dist/voice/audio_recognition.js +289 -7
  238. package/dist/voice/audio_recognition.js.map +1 -1
  239. package/dist/voice/client_events.cjs +554 -0
  240. package/dist/voice/client_events.cjs.map +1 -0
  241. package/dist/voice/client_events.d.cts +195 -0
  242. package/dist/voice/client_events.d.ts +195 -0
  243. package/dist/voice/client_events.d.ts.map +1 -0
  244. package/dist/voice/client_events.js +548 -0
  245. package/dist/voice/client_events.js.map +1 -0
  246. package/dist/voice/events.cjs +1 -0
  247. package/dist/voice/events.cjs.map +1 -1
  248. package/dist/voice/events.d.cts +8 -5
  249. package/dist/voice/events.d.ts +8 -5
  250. package/dist/voice/events.d.ts.map +1 -1
  251. package/dist/voice/events.js +1 -0
  252. package/dist/voice/events.js.map +1 -1
  253. package/dist/voice/generation.cjs +43 -8
  254. package/dist/voice/generation.cjs.map +1 -1
  255. package/dist/voice/generation.d.cts +3 -3
  256. package/dist/voice/generation.d.ts +3 -3
  257. package/dist/voice/generation.d.ts.map +1 -1
  258. package/dist/voice/generation.js +43 -8
  259. package/dist/voice/generation.js.map +1 -1
  260. package/dist/voice/index.cjs +1 -0
  261. package/dist/voice/index.cjs.map +1 -1
  262. package/dist/voice/index.d.cts +1 -0
  263. package/dist/voice/index.d.ts +1 -0
  264. package/dist/voice/index.d.ts.map +1 -1
  265. package/dist/voice/index.js +1 -0
  266. package/dist/voice/index.js.map +1 -1
  267. package/dist/voice/report.cjs +20 -8
  268. package/dist/voice/report.cjs.map +1 -1
  269. package/dist/voice/report.d.cts +5 -0
  270. package/dist/voice/report.d.ts +5 -0
  271. package/dist/voice/report.d.ts.map +1 -1
  272. package/dist/voice/report.js +20 -8
  273. package/dist/voice/report.js.map +1 -1
  274. package/dist/voice/report.test.cjs +106 -0
  275. package/dist/voice/report.test.cjs.map +1 -0
  276. package/dist/voice/report.test.js +105 -0
  277. package/dist/voice/report.test.js.map +1 -0
  278. package/dist/voice/room_io/room_io.cjs +5 -39
  279. package/dist/voice/room_io/room_io.cjs.map +1 -1
  280. package/dist/voice/room_io/room_io.d.cts +4 -9
  281. package/dist/voice/room_io/room_io.d.ts +4 -9
  282. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  283. package/dist/voice/room_io/room_io.js +5 -40
  284. package/dist/voice/room_io/room_io.js.map +1 -1
  285. package/dist/voice/turn_config/endpointing.cjs +33 -0
  286. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  287. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  288. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  289. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  290. package/dist/voice/turn_config/endpointing.js +9 -0
  291. package/dist/voice/turn_config/endpointing.js.map +1 -0
  292. package/dist/voice/turn_config/interruption.cjs +37 -0
  293. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  294. package/dist/voice/turn_config/interruption.d.cts +53 -0
  295. package/dist/voice/turn_config/interruption.d.ts +53 -0
  296. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  297. package/dist/voice/turn_config/interruption.js +13 -0
  298. package/dist/voice/turn_config/interruption.js.map +1 -0
  299. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  300. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  301. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  302. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  303. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  304. package/dist/voice/turn_config/turn_handling.js +11 -0
  305. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  306. package/dist/voice/turn_config/utils.cjs +97 -0
  307. package/dist/voice/turn_config/utils.cjs.map +1 -0
  308. package/dist/voice/turn_config/utils.d.cts +25 -0
  309. package/dist/voice/turn_config/utils.d.ts +25 -0
  310. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  311. package/dist/voice/turn_config/utils.js +73 -0
  312. package/dist/voice/turn_config/utils.js.map +1 -0
  313. package/dist/voice/turn_config/utils.test.cjs +86 -0
  314. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  315. package/dist/voice/turn_config/utils.test.js +85 -0
  316. package/dist/voice/turn_config/utils.test.js.map +1 -0
  317. package/dist/voice/wire_format.cjs +798 -0
  318. package/dist/voice/wire_format.cjs.map +1 -0
  319. package/dist/voice/wire_format.d.cts +5503 -0
  320. package/dist/voice/wire_format.d.ts +5503 -0
  321. package/dist/voice/wire_format.d.ts.map +1 -0
  322. package/dist/voice/wire_format.js +728 -0
  323. package/dist/voice/wire_format.js.map +1 -0
  324. package/package.json +2 -1
  325. package/src/constants.ts +13 -0
  326. package/src/inference/interruption/defaults.ts +51 -0
  327. package/src/inference/interruption/errors.ts +25 -0
  328. package/src/inference/interruption/http_transport.ts +187 -0
  329. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  330. package/src/inference/interruption/interruption_detector.ts +188 -0
  331. package/src/inference/interruption/interruption_stream.ts +467 -0
  332. package/src/inference/interruption/types.ts +84 -0
  333. package/src/inference/interruption/utils.test.ts +132 -0
  334. package/src/inference/interruption/utils.ts +137 -0
  335. package/src/inference/interruption/ws_transport.ts +402 -0
  336. package/src/inference/llm.ts +9 -12
  337. package/src/inference/stt.ts +10 -3
  338. package/src/inference/tts.ts +10 -3
  339. package/src/inference/utils.ts +29 -1
  340. package/src/llm/chat_context.ts +40 -2
  341. package/src/llm/index.ts +1 -0
  342. package/src/llm/llm.ts +16 -0
  343. package/src/llm/realtime.ts +4 -0
  344. package/src/metrics/base.ts +48 -1
  345. package/src/metrics/index.ts +11 -0
  346. package/src/metrics/model_usage.test.ts +545 -0
  347. package/src/metrics/model_usage.ts +262 -0
  348. package/src/metrics/usage_collector.ts +11 -0
  349. package/src/metrics/utils.ts +11 -0
  350. package/src/stream/multi_input_stream.test.ts +6 -1
  351. package/src/stream/stream_channel.ts +34 -2
  352. package/src/stt/stt.ts +38 -0
  353. package/src/telemetry/otel_http_exporter.ts +28 -5
  354. package/src/telemetry/trace_types.ts +11 -8
  355. package/src/telemetry/traces.ts +111 -54
  356. package/src/tts/tts.ts +69 -1
  357. package/src/voice/agent.ts +30 -3
  358. package/src/voice/agent_activity.ts +327 -28
  359. package/src/voice/agent_session.ts +207 -59
  360. package/src/voice/audio_recognition.ts +385 -9
  361. package/src/voice/client_events.ts +838 -0
  362. package/src/voice/events.ts +14 -4
  363. package/src/voice/generation.ts +52 -9
  364. package/src/voice/index.ts +1 -0
  365. package/src/voice/report.test.ts +117 -0
  366. package/src/voice/report.ts +29 -6
  367. package/src/voice/room_io/room_io.ts +7 -61
  368. package/src/voice/turn_config/endpointing.ts +33 -0
  369. package/src/voice/turn_config/interruption.ts +56 -0
  370. package/src/voice/turn_config/turn_handling.ts +45 -0
  371. package/src/voice/turn_config/utils.test.ts +100 -0
  372. package/src/voice/turn_config/utils.ts +103 -0
  373. package/src/voice/wire_format.ts +827 -0
@@ -18,7 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var agent_session_exports = {};
20
20
  __export(agent_session_exports, {
21
- AgentSession: () => AgentSession
21
+ AgentSession: () => AgentSession,
22
+ defaultSessionOptions: () => defaultSessionOptions
22
23
  });
23
24
  module.exports = __toCommonJS(agent_session_exports);
24
25
  var import_mutex = require("@livekit/mutex");
@@ -28,26 +29,25 @@ var import_inference = require("../inference/index.cjs");
28
29
  var import_job = require("../job.cjs");
29
30
  var import_chat_context = require("../llm/chat_context.cjs");
30
31
  var import_log = require("../log.cjs");
32
+ var import_model_usage = require("../metrics/model_usage.cjs");
31
33
  var import_telemetry = require("../telemetry/index.cjs");
32
34
  var import_types = require("../types.cjs");
33
35
  var import_utils = require("../utils.cjs");
34
36
  var import_agent_activity = require("./agent_activity.cjs");
37
+ var import_client_events = require("./client_events.cjs");
35
38
  var import_events = require("./events.cjs");
36
39
  var import_io = require("./io.cjs");
37
40
  var import_recorder_io = require("./recorder_io/index.cjs");
38
41
  var import_room_io = require("./room_io/index.cjs");
39
42
  var import_run_result = require("./testing/run_result.cjs");
40
- var import_utils2 = require("./utils.cjs");
41
- const defaultVoiceOptions = {
42
- allowInterruptions: true,
43
- discardAudioIfUninterruptible: true,
44
- minInterruptionDuration: 500,
45
- minInterruptionWords: 0,
46
- minEndpointingDelay: 500,
47
- maxEndpointingDelay: 6e3,
43
+ var import_utils2 = require("./turn_config/utils.cjs");
44
+ var import_utils3 = require("./utils.cjs");
45
+ const defaultSessionOptions = {
48
46
  maxToolSteps: 3,
49
47
  preemptiveGeneration: false,
50
48
  userAwayTimeout: 15,
49
+ aecWarmupDuration: 3e3,
50
+ turnHandling: {},
51
51
  useTtsAlignedTranscript: true
52
52
  };
53
53
  class AgentSession extends import_node_events.EventEmitter {
@@ -57,31 +57,36 @@ class AgentSession extends import_node_events.EventEmitter {
57
57
  tts;
58
58
  turnDetection;
59
59
  options;
60
+ activityLock = new import_mutex.Mutex();
60
61
  agent;
61
62
  activity;
62
63
  nextActivity;
63
64
  updateActivityTask;
64
65
  started = false;
65
- userState = "listening";
66
- activityLock = new import_mutex.Mutex();
67
- /** @internal */
68
- _roomIO;
69
- logger = (0, import_log.log)();
66
+ clientEventsHandler;
70
67
  _chatCtx;
71
68
  _userData;
69
+ _userState = "listening";
72
70
  _agentState = "initializing";
73
71
  _input;
74
72
  _output;
75
73
  closingTask = null;
76
74
  userAwayTimer = null;
75
+ _aecWarmupTimer = null;
77
76
  // Connection options for STT, LLM, and TTS
78
77
  _connOptions;
79
78
  // Unrecoverable error counts, reset after agent speaking
80
79
  llmErrorCounts = 0;
81
80
  ttsErrorCounts = 0;
81
+ interruptionDetectionErrorCounts = 0;
82
82
  sessionSpan;
83
- userSpeakingSpan;
84
83
  agentSpeakingSpan;
84
+ _interruptionDetection;
85
+ _usageCollector = new import_model_usage.ModelUsageCollector();
86
+ /** @internal */
87
+ _roomIO;
88
+ /** @internal */
89
+ _aecWarmupRemaining = 0;
85
90
  /** @internal */
86
91
  _recorderIO;
87
92
  /** @internal */
@@ -94,18 +99,14 @@ class AgentSession extends import_node_events.EventEmitter {
94
99
  _startedAt;
95
100
  /** @internal - Current run state for testing */
96
101
  _globalRunState;
97
- constructor(opts) {
102
+ /** @internal */
103
+ _userSpeakingSpan;
104
+ logger = (0, import_log.log)();
105
+ constructor(options) {
106
+ var _a, _b, _c;
98
107
  super();
99
- const {
100
- vad,
101
- stt,
102
- llm,
103
- tts,
104
- turnDetection,
105
- userData,
106
- voiceOptions = defaultVoiceOptions,
107
- connOptions
108
- } = opts;
108
+ const opts = (0, import_utils2.migrateLegacyOptions)(options);
109
+ const { vad, stt, llm, tts, userData, connOptions, options: sessionOptions } = opts;
109
110
  this._connOptions = {
110
111
  sttConnOptions: { ...import_types.DEFAULT_API_CONNECT_OPTIONS, ...connOptions == null ? void 0 : connOptions.sttConnOptions },
111
112
  llmConnOptions: { ...import_types.DEFAULT_API_CONNECT_OPTIONS, ...connOptions == null ? void 0 : connOptions.llmConnOptions },
@@ -128,18 +129,23 @@ class AgentSession extends import_node_events.EventEmitter {
128
129
  } else {
129
130
  this.tts = tts;
130
131
  }
131
- this.turnDetection = turnDetection;
132
+ this.turnDetection = (_a = sessionOptions == null ? void 0 : sessionOptions.turnHandling) == null ? void 0 : _a.turnDetection;
133
+ this._interruptionDetection = (_c = (_b = sessionOptions == null ? void 0 : sessionOptions.turnHandling) == null ? void 0 : _b.interruption) == null ? void 0 : _c.mode;
132
134
  this._userData = userData;
133
135
  this._input = new import_io.AgentInput(this.onAudioInputChanged);
134
136
  this._output = new import_io.AgentOutput(this.onAudioOutputChanged, this.onTextOutputChanged);
135
137
  this._chatCtx = import_chat_context.ChatContext.empty();
136
- this.options = { ...defaultVoiceOptions, ...voiceOptions };
138
+ this.options = opts.options;
139
+ this._aecWarmupRemaining = this.options.aecWarmupDuration ?? 0;
137
140
  this._onUserInputTranscribed = this._onUserInputTranscribed.bind(this);
138
141
  this.on(import_events.AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);
139
142
  }
140
143
  emit(event, ...args) {
141
144
  const eventData = args[0];
142
145
  this._recordedEvents.push(eventData);
146
+ if (event === import_events.AgentSessionEventTypes.MetricsCollected) {
147
+ this._usageCollector.collect(eventData.metrics);
148
+ }
143
149
  return super.emit(event, ...args);
144
150
  }
145
151
  get input() {
@@ -161,6 +167,15 @@ class AgentSession extends import_node_events.EventEmitter {
161
167
  get connOptions() {
162
168
  return this._connOptions;
163
169
  }
170
+ get interruptionDetection() {
171
+ return this._interruptionDetection;
172
+ }
173
+ /**
174
+ * Returns usage summaries for this session, one per model/provider combination.
175
+ */
176
+ get usage() {
177
+ return { modelUsage: this._usageCollector.flatten().map(import_model_usage.filterZeroValues) };
178
+ }
164
179
  get useTtsAlignedTranscript() {
165
180
  return this.options.useTtsAlignedTranscript;
166
181
  }
@@ -201,6 +216,12 @@ class AgentSession extends import_node_events.EventEmitter {
201
216
  outputOptions
202
217
  });
203
218
  this._roomIO.start();
219
+ this.clientEventsHandler = new import_client_events.ClientEventsHandler(this, this._roomIO);
220
+ if ((inputOptions == null ? void 0 : inputOptions.textEnabled) !== false) {
221
+ this.clientEventsHandler.registerTextInput(
222
+ (inputOptions == null ? void 0 : inputOptions.textInputCallback) ?? import_room_io.DEFAULT_TEXT_INPUT_CALLBACK
223
+ );
224
+ }
204
225
  }
205
226
  let ctx = void 0;
206
227
  try {
@@ -231,6 +252,9 @@ class AgentSession extends import_node_events.EventEmitter {
231
252
  }
232
253
  tasks.push(this._updateActivity(this.agent, { waitOnEnter: false }));
233
254
  await Promise.allSettled(tasks);
255
+ if (this.clientEventsHandler) {
256
+ await this.clientEventsHandler.start();
257
+ }
234
258
  this.logger.debug(
235
259
  `using audio io: ${this.input.audio ? "`" + this.input.audio.constructor.name + "`" : "(none)"} -> \`AgentSession\` -> ${this.output.audio ? "`" + this.output.audio.constructor.name + "`" : "(none)"}`
236
260
  );
@@ -251,6 +275,7 @@ class AgentSession extends import_node_events.EventEmitter {
251
275
  if (this.started) {
252
276
  return;
253
277
  }
278
+ this._usageCollector = new import_model_usage.ModelUsageCollector();
254
279
  let ctx = void 0;
255
280
  try {
256
281
  ctx = (0, import_job.getJobContext)();
@@ -501,6 +526,9 @@ class AgentSession extends import_node_events.EventEmitter {
501
526
  get agentState() {
502
527
  return this._agentState;
503
528
  }
529
+ get userState() {
530
+ return this._userState;
531
+ }
504
532
  get currentAgent() {
505
533
  if (!this.agent) {
506
534
  throw new Error("AgentSession is not running");
@@ -543,6 +571,11 @@ class AgentSession extends import_node_events.EventEmitter {
543
571
  if (this.ttsErrorCounts <= this._connOptions.maxUnrecoverableErrors) {
544
572
  return;
545
573
  }
574
+ } else if (error.type === "interruption_detection_error") {
575
+ this.interruptionDetectionErrorCounts += 1;
576
+ if (this.interruptionDetectionErrorCounts <= this._connOptions.maxUnrecoverableErrors) {
577
+ return;
578
+ }
546
579
  }
547
580
  this.logger.error(error, "AgentSession is closing due to unrecoverable error");
548
581
  this.closingTask = (async () => {
@@ -569,6 +602,7 @@ class AgentSession extends import_node_events.EventEmitter {
569
602
  if (state === "speaking") {
570
603
  this.llmErrorCounts = 0;
571
604
  this.ttsErrorCounts = 0;
605
+ this.interruptionDetectionErrorCounts = 0;
572
606
  if (this.agentSpeakingSpan === void 0) {
573
607
  this.agentSpeakingSpan = import_telemetry.tracer.startSpan({
574
608
  name: "agent_speaking",
@@ -577,16 +611,23 @@ class AgentSession extends import_node_events.EventEmitter {
577
611
  });
578
612
  const localParticipant = (_a = this._roomIO) == null ? void 0 : _a.localParticipant;
579
613
  if (localParticipant) {
580
- (0, import_utils2.setParticipantSpanAttributes)(this.agentSpeakingSpan, localParticipant);
614
+ (0, import_utils3.setParticipantSpanAttributes)(this.agentSpeakingSpan, localParticipant);
581
615
  }
582
616
  }
583
617
  } else if (this.agentSpeakingSpan !== void 0) {
584
618
  this.agentSpeakingSpan.end();
585
619
  this.agentSpeakingSpan = void 0;
586
620
  }
621
+ if (state === "speaking" && this._aecWarmupRemaining > 0 && this._aecWarmupTimer === null) {
622
+ this._aecWarmupTimer = setTimeout(() => this._onAecWarmupExpired(), this._aecWarmupRemaining);
623
+ this.logger.debug(
624
+ { warmupDurationMs: this._aecWarmupRemaining },
625
+ "aec warmup active, disabling interruptions"
626
+ );
627
+ }
587
628
  const oldState = this._agentState;
588
629
  this._agentState = state;
589
- if (state === "listening" && this.userState === "listening") {
630
+ if (state === "listening" && this._userState === "listening") {
590
631
  this._setUserAwayTimer();
591
632
  } else {
592
633
  this._cancelUserAwayTimer();
@@ -599,25 +640,25 @@ class AgentSession extends import_node_events.EventEmitter {
599
640
  /** @internal */
600
641
  _updateUserState(state, lastSpeakingTime) {
601
642
  var _a;
602
- if (this.userState === state) {
643
+ if (this._userState === state) {
603
644
  return;
604
645
  }
605
- if (state === "speaking" && this.userSpeakingSpan === void 0) {
606
- this.userSpeakingSpan = import_telemetry.tracer.startSpan({
646
+ if (state === "speaking" && this._userSpeakingSpan === void 0) {
647
+ this._userSpeakingSpan = import_telemetry.tracer.startSpan({
607
648
  name: "user_speaking",
608
649
  context: this.rootSpanContext,
609
650
  startTime: lastSpeakingTime
610
651
  });
611
652
  const linked = (_a = this._roomIO) == null ? void 0 : _a.linkedParticipant;
612
653
  if (linked) {
613
- (0, import_utils2.setParticipantSpanAttributes)(this.userSpeakingSpan, linked);
654
+ (0, import_utils3.setParticipantSpanAttributes)(this._userSpeakingSpan, linked);
614
655
  }
615
- } else if (this.userSpeakingSpan !== void 0) {
616
- this.userSpeakingSpan.end(lastSpeakingTime);
617
- this.userSpeakingSpan = void 0;
656
+ } else if (this._userSpeakingSpan !== void 0) {
657
+ this._userSpeakingSpan.end(lastSpeakingTime);
658
+ this._userSpeakingSpan = void 0;
618
659
  }
619
- const oldState = this.userState;
620
- this.userState = state;
660
+ const oldState = this._userState;
661
+ this._userState = state;
621
662
  if (state === "listening" && this._agentState === "listening") {
622
663
  this._setUserAwayTimer();
623
664
  } else {
@@ -660,8 +701,19 @@ class AgentSession extends import_node_events.EventEmitter {
660
701
  this.userAwayTimer = null;
661
702
  }
662
703
  }
704
+ /** @internal */
705
+ _onAecWarmupExpired() {
706
+ if (this._aecWarmupRemaining > 0) {
707
+ this.logger.debug("aec warmup expired, re-enabling interruptions");
708
+ }
709
+ this._aecWarmupRemaining = 0;
710
+ if (this._aecWarmupTimer !== null) {
711
+ clearTimeout(this._aecWarmupTimer);
712
+ this._aecWarmupTimer = null;
713
+ }
714
+ }
663
715
  _onUserInputTranscribed(ev) {
664
- if (this.userState === "away" && ev.isFinal) {
716
+ if (this._userState === "away" && ev.isFinal) {
665
717
  this.logger.debug("User returned from away state due to speech input");
666
718
  this._updateUserState("listening");
667
719
  }
@@ -675,11 +727,12 @@ class AgentSession extends import_node_events.EventEmitter {
675
727
  return this.closeImplInner(reason, error, drain);
676
728
  }
677
729
  async closeImplInner(reason, error = null, drain = false) {
678
- var _a, _b, _c;
730
+ var _a, _b, _c, _d;
679
731
  if (!this.started) {
680
732
  return;
681
733
  }
682
734
  this._cancelUserAwayTimer();
735
+ this._onAecWarmupExpired();
683
736
  this.off(import_events.AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);
684
737
  if (this.activity) {
685
738
  if (!drain) {
@@ -705,17 +758,19 @@ class AgentSession extends import_node_events.EventEmitter {
705
758
  this.input.audio = null;
706
759
  this.output.audio = null;
707
760
  this.output.transcription = null;
708
- await ((_b = this._roomIO) == null ? void 0 : _b.close());
761
+ await ((_b = this.clientEventsHandler) == null ? void 0 : _b.close());
762
+ this.clientEventsHandler = void 0;
763
+ await ((_c = this._roomIO) == null ? void 0 : _c.close());
709
764
  this._roomIO = void 0;
710
- await ((_c = this.activity) == null ? void 0 : _c.close());
765
+ await ((_d = this.activity) == null ? void 0 : _d.close());
711
766
  this.activity = void 0;
712
767
  if (this.sessionSpan) {
713
768
  this.sessionSpan.end();
714
769
  this.sessionSpan = void 0;
715
770
  }
716
- if (this.userSpeakingSpan) {
717
- this.userSpeakingSpan.end();
718
- this.userSpeakingSpan = void 0;
771
+ if (this._userSpeakingSpan) {
772
+ this._userSpeakingSpan.end();
773
+ this._userSpeakingSpan = void 0;
719
774
  }
720
775
  if (this.agentSpeakingSpan) {
721
776
  this.agentSpeakingSpan.end();
@@ -723,16 +778,18 @@ class AgentSession extends import_node_events.EventEmitter {
723
778
  }
724
779
  this.started = false;
725
780
  this.emit(import_events.AgentSessionEventTypes.Close, (0, import_events.createCloseEvent)(reason, error));
726
- this.userState = "listening";
781
+ this._userState = "listening";
727
782
  this._agentState = "initializing";
728
783
  this.rootSpanContext = void 0;
729
784
  this.llmErrorCounts = 0;
730
785
  this.ttsErrorCounts = 0;
786
+ this.interruptionDetectionErrorCounts = 0;
731
787
  this.logger.info({ reason, error }, "AgentSession closed");
732
788
  }
733
789
  }
734
790
  // Annotate the CommonJS export names for ESM import in node:
735
791
  0 && (module.exports = {
736
- AgentSession
792
+ AgentSession,
793
+ defaultSessionOptions
737
794
  });
738
795
  //# sourceMappingURL=agent_session.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/voice/agent_session.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { AudioFrame, Room } from '@livekit/rtc-node';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport type { Context, Span } from '@opentelemetry/api';\nimport { ROOT_CONTEXT, context as otelContext, trace } from '@opentelemetry/api';\nimport { EventEmitter } from 'node:events';\nimport type { ReadableStream } from 'node:stream/web';\nimport type { z } from 'zod';\nimport {\n LLM as InferenceLLM,\n STT as InferenceSTT,\n TTS as InferenceTTS,\n type LLMModels,\n type STTModelString,\n type TTSModelString,\n} from '../inference/index.js';\nimport { type JobContext, getJobContext } from '../job.js';\nimport type { FunctionCall, FunctionCallOutput } from '../llm/chat_context.js';\nimport { AgentHandoffItem, ChatContext, ChatMessage } from '../llm/chat_context.js';\nimport type { LLM, RealtimeModel, RealtimeModelError, ToolChoice } from '../llm/index.js';\nimport type { LLMError } from '../llm/llm.js';\nimport { log } from '../log.js';\nimport type { STT } from '../stt/index.js';\nimport type { STTError } from '../stt/stt.js';\nimport { traceTypes, tracer } from '../telemetry/index.js';\nimport type { TTS, TTSError } from '../tts/tts.js';\nimport {\n DEFAULT_API_CONNECT_OPTIONS,\n DEFAULT_SESSION_CONNECT_OPTIONS,\n type ResolvedSessionConnectOptions,\n type SessionConnectOptions,\n} from '../types.js';\nimport { Task } from '../utils.js';\nimport type { VAD } from '../vad.js';\nimport type { Agent } from './agent.js';\nimport { AgentActivity } from './agent_activity.js';\nimport type { _TurnDetector } from './audio_recognition.js';\nimport {\n type AgentEvent,\n AgentSessionEventTypes,\n type AgentState,\n type AgentStateChangedEvent,\n type CloseEvent,\n CloseReason,\n type ConversationItemAddedEvent,\n type ErrorEvent,\n type FunctionToolsExecutedEvent,\n type MetricsCollectedEvent,\n type ShutdownReason,\n type SpeechCreatedEvent,\n type UserInputTranscribedEvent,\n type UserState,\n type UserStateChangedEvent,\n createAgentStateChangedEvent,\n createCloseEvent,\n createConversationItemAddedEvent,\n createUserStateChangedEvent,\n} from './events.js';\nimport { AgentInput, AgentOutput } from './io.js';\nimport { RecorderIO } from './recorder_io/index.js';\nimport { RoomIO, type RoomInputOptions, type RoomOutputOptions } from './room_io/index.js';\nimport type { UnknownUserData } from './run_context.js';\nimport type { SpeechHandle } from './speech_handle.js';\nimport { RunResult } from './testing/run_result.js';\nimport { setParticipantSpanAttributes } from './utils.js';\n\nexport interface VoiceOptions {\n allowInterruptions: boolean;\n discardAudioIfUninterruptible: boolean;\n minInterruptionDuration: number;\n minInterruptionWords: number;\n minEndpointingDelay: number;\n maxEndpointingDelay: number;\n maxToolSteps: number;\n preemptiveGeneration: boolean;\n userAwayTimeout?: number | null;\n useTtsAlignedTranscript: boolean;\n}\n\nconst defaultVoiceOptions: VoiceOptions = {\n allowInterruptions: true,\n discardAudioIfUninterruptible: true,\n minInterruptionDuration: 500,\n minInterruptionWords: 0,\n minEndpointingDelay: 500,\n maxEndpointingDelay: 6000,\n maxToolSteps: 3,\n preemptiveGeneration: false,\n userAwayTimeout: 15.0,\n useTtsAlignedTranscript: true,\n} as const;\n\nexport type TurnDetectionMode = 'stt' | 'vad' | 'realtime_llm' | 'manual' | _TurnDetector;\n\nexport type AgentSessionCallbacks = {\n [AgentSessionEventTypes.UserInputTranscribed]: (ev: UserInputTranscribedEvent) => void;\n [AgentSessionEventTypes.AgentStateChanged]: (ev: AgentStateChangedEvent) => void;\n [AgentSessionEventTypes.UserStateChanged]: (ev: UserStateChangedEvent) => void;\n [AgentSessionEventTypes.ConversationItemAdded]: (ev: ConversationItemAddedEvent) => void;\n [AgentSessionEventTypes.FunctionToolsExecuted]: (ev: FunctionToolsExecutedEvent) => void;\n [AgentSessionEventTypes.MetricsCollected]: (ev: MetricsCollectedEvent) => void;\n [AgentSessionEventTypes.SpeechCreated]: (ev: SpeechCreatedEvent) => void;\n [AgentSessionEventTypes.Error]: (ev: ErrorEvent) => void;\n [AgentSessionEventTypes.Close]: (ev: CloseEvent) => void;\n};\n\nexport type AgentSessionOptions<UserData = UnknownUserData> = {\n turnDetection?: TurnDetectionMode;\n stt?: STT | STTModelString;\n vad?: VAD;\n llm?: LLM | RealtimeModel | LLMModels;\n tts?: TTS | TTSModelString;\n userData?: UserData;\n voiceOptions?: Partial<VoiceOptions>;\n connOptions?: SessionConnectOptions;\n};\n\ntype ActivityTransitionOptions = {\n previousActivity?: 'close' | 'pause';\n newActivity?: 'start' | 'resume';\n blockedTasks?: Task<any>[];\n waitOnEnter?: boolean;\n};\n\nexport class AgentSession<\n UserData = UnknownUserData,\n> extends (EventEmitter as new () => TypedEmitter<AgentSessionCallbacks>) {\n vad?: VAD;\n stt?: STT;\n llm?: LLM | RealtimeModel;\n tts?: TTS;\n turnDetection?: TurnDetectionMode;\n\n readonly options: VoiceOptions;\n\n private agent?: Agent;\n private activity?: AgentActivity;\n private nextActivity?: AgentActivity;\n private updateActivityTask?: Task<void>;\n private started = false;\n private userState: UserState = 'listening';\n private readonly activityLock = new Mutex();\n\n /** @internal */\n _roomIO?: RoomIO;\n private logger = log();\n\n private _chatCtx: ChatContext;\n private _userData: UserData | undefined;\n private _agentState: AgentState = 'initializing';\n\n private _input: AgentInput;\n private _output: AgentOutput;\n\n private closingTask: Promise<void> | null = null;\n private userAwayTimer: NodeJS.Timeout | null = null;\n\n // Connection options for STT, LLM, and TTS\n private _connOptions: ResolvedSessionConnectOptions;\n\n // Unrecoverable error counts, reset after agent speaking\n private llmErrorCounts = 0;\n private ttsErrorCounts = 0;\n\n private sessionSpan?: Span;\n private userSpeakingSpan?: Span;\n private agentSpeakingSpan?: Span;\n\n /** @internal */\n _recorderIO?: RecorderIO;\n\n /** @internal */\n rootSpanContext?: Context;\n\n /** @internal */\n _recordedEvents: AgentEvent[] = [];\n\n /** @internal */\n _enableRecording = false;\n\n /** @internal - Timestamp when the session started (milliseconds) */\n _startedAt?: number;\n\n /** @internal - Current run state for testing */\n _globalRunState?: RunResult;\n\n constructor(opts: AgentSessionOptions<UserData>) {\n super();\n\n const {\n vad,\n stt,\n llm,\n tts,\n turnDetection,\n userData,\n voiceOptions = defaultVoiceOptions,\n connOptions,\n } = opts;\n\n // Merge user-provided connOptions with defaults\n this._connOptions = {\n sttConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.sttConnOptions },\n llmConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.llmConnOptions },\n ttsConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.ttsConnOptions },\n maxUnrecoverableErrors:\n connOptions?.maxUnrecoverableErrors ??\n DEFAULT_SESSION_CONNECT_OPTIONS.maxUnrecoverableErrors,\n };\n\n this.vad = vad;\n\n if (typeof stt === 'string') {\n this.stt = InferenceSTT.fromModelString(stt);\n } else {\n this.stt = stt;\n }\n\n if (typeof llm === 'string') {\n this.llm = InferenceLLM.fromModelString(llm);\n } else {\n this.llm = llm;\n }\n\n if (typeof tts === 'string') {\n this.tts = InferenceTTS.fromModelString(tts);\n } else {\n this.tts = tts;\n }\n\n this.turnDetection = turnDetection;\n this._userData = userData;\n\n // configurable IO\n this._input = new AgentInput(this.onAudioInputChanged);\n this._output = new AgentOutput(this.onAudioOutputChanged, this.onTextOutputChanged);\n\n // This is the \"global\" chat context, it holds the entire conversation history\n this._chatCtx = ChatContext.empty();\n this.options = { ...defaultVoiceOptions, ...voiceOptions };\n\n this._onUserInputTranscribed = this._onUserInputTranscribed.bind(this);\n this.on(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);\n }\n\n emit<K extends keyof AgentSessionCallbacks>(\n event: K,\n ...args: Parameters<AgentSessionCallbacks[K]>\n ): boolean {\n const eventData = args[0] as AgentEvent;\n this._recordedEvents.push(eventData);\n return super.emit(event, ...args);\n }\n\n get input(): AgentInput {\n return this._input;\n }\n\n get output(): AgentOutput {\n return this._output;\n }\n\n get userData(): UserData {\n if (this._userData === undefined) {\n throw new Error('Voice agent userData is not set');\n }\n\n return this._userData;\n }\n\n get history(): ChatContext {\n return this._chatCtx;\n }\n\n /** Connection options for STT, LLM, and TTS. */\n get connOptions(): ResolvedSessionConnectOptions {\n return this._connOptions;\n }\n\n get useTtsAlignedTranscript(): boolean {\n return this.options.useTtsAlignedTranscript;\n }\n\n set userData(value: UserData) {\n this._userData = value;\n }\n\n private async _startImpl({\n agent,\n room,\n inputOptions,\n outputOptions,\n span,\n }: {\n agent: Agent;\n room?: Room;\n inputOptions?: Partial<RoomInputOptions>;\n outputOptions?: Partial<RoomOutputOptions>;\n span: Span;\n }): Promise<void> {\n span.setAttribute(traceTypes.ATTR_AGENT_LABEL, agent.id);\n\n this.agent = agent;\n this._updateAgentState('initializing');\n\n const tasks: Promise<void>[] = [];\n\n if (room && !this._roomIO) {\n // Check for existing input/output configuration and warn if needed\n if (this.input.audio && inputOptions?.audioEnabled !== false) {\n this.logger.warn(\n 'RoomIO audio input is enabled but input.audio is already set, ignoring..',\n );\n }\n\n if (this.output.audio && outputOptions?.audioEnabled !== false) {\n this.logger.warn(\n 'RoomIO audio output is enabled but output.audio is already set, ignoring..',\n );\n }\n\n if (this.output.transcription && outputOptions?.transcriptionEnabled !== false) {\n this.logger.warn(\n 'RoomIO transcription output is enabled but output.transcription is already set, ignoring..',\n );\n }\n\n this._roomIO = new RoomIO({\n agentSession: this,\n room,\n inputOptions,\n outputOptions,\n });\n this._roomIO.start();\n }\n\n let ctx: JobContext | undefined = undefined;\n try {\n ctx = getJobContext();\n } catch {\n // JobContext is not available in evals\n }\n\n if (ctx) {\n if (room && ctx.room === room && !room.isConnected) {\n this.logger.debug('Auto-connecting to room via job context');\n tasks.push(ctx.connect());\n }\n\n if (ctx._primaryAgentSession === undefined) {\n ctx._primaryAgentSession = this;\n } else if (this._enableRecording) {\n throw new Error(\n 'Only one `AgentSession` can be the primary at a time. If you want to ignore primary designation, use `session.start({ record: false })`.',\n );\n }\n\n if (this.input.audio && this.output.audio && this._enableRecording) {\n this._recorderIO = new RecorderIO({ agentSession: this });\n this.input.audio = this._recorderIO.recordInput(this.input.audio);\n this.output.audio = this._recorderIO.recordOutput(this.output.audio);\n\n // Start recording to session directory\n const sessionDir = ctx.sessionDirectory;\n if (sessionDir) {\n tasks.push(this._recorderIO.start(`${sessionDir}/audio.ogg`));\n }\n }\n }\n\n // TODO(AJS-265): add shutdown callback to job context\n // Initial start does not wait on onEnter\n tasks.push(this._updateActivity(this.agent, { waitOnEnter: false }));\n\n await Promise.allSettled(tasks);\n\n // Log used IO configuration\n this.logger.debug(\n `using audio io: ${this.input.audio ? '`' + this.input.audio.constructor.name + '`' : '(none)'} -> \\`AgentSession\\` -> ${this.output.audio ? '`' + this.output.audio.constructor.name + '`' : '(none)'}`,\n );\n\n this.logger.debug(\n `using transcript io: \\`AgentSession\\` -> ${this.output.transcription ? '`' + this.output.transcription.constructor.name + '`' : '(none)'}`,\n );\n\n this.started = true;\n this._startedAt = Date.now();\n this._updateAgentState('listening');\n }\n\n async start({\n agent,\n room,\n inputOptions,\n outputOptions,\n record,\n }: {\n agent: Agent;\n room?: Room;\n inputOptions?: Partial<RoomInputOptions>;\n outputOptions?: Partial<RoomOutputOptions>;\n record?: boolean;\n }): Promise<void> {\n if (this.started) {\n return;\n }\n\n let ctx: JobContext | undefined = undefined;\n try {\n ctx = getJobContext();\n\n if (record === undefined) {\n record = ctx.job.enableRecording;\n }\n\n this._enableRecording = record;\n\n if (this._enableRecording) {\n ctx.initRecording();\n }\n } catch (error) {\n // JobContext is not available in evals\n this.logger.warn('JobContext is not available');\n }\n\n this.sessionSpan = tracer.startSpan({\n name: 'agent_session',\n context: ROOT_CONTEXT,\n });\n\n this.rootSpanContext = trace.setSpan(ROOT_CONTEXT, this.sessionSpan);\n\n await this._startImpl({\n agent,\n room,\n inputOptions,\n outputOptions,\n span: this.sessionSpan,\n });\n }\n\n updateAgent(agent: Agent): void {\n this.agent = agent;\n\n if (!this.started) {\n return;\n }\n\n const _updateActivityTask = async (oldTask: Task<void> | undefined, agent: Agent) => {\n if (oldTask) {\n try {\n await oldTask.result;\n } catch (error) {\n this.logger.error(error, 'previous updateAgent transition failed');\n }\n }\n\n await this._updateActivity(agent);\n };\n\n const oldTask = this.updateActivityTask;\n this.updateActivityTask = Task.from(\n async () => _updateActivityTask(oldTask, agent),\n undefined,\n 'AgentSession_updateActivityTask',\n );\n\n const runState = this._globalRunState;\n if (runState) {\n // Don't mark the RunResult as done, if there is currently an agent transition happening.\n // (used to make sure we're correctly adding the AgentHandoffResult before completion)\n runState._watchHandle(this.updateActivityTask);\n }\n }\n\n commitUserTurn() {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n this.activity.commitUserTurn();\n }\n\n clearUserTurn() {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n this.activity.clearUserTurn();\n }\n\n say(\n text: string | ReadableStream<string>,\n options?: {\n audio?: ReadableStream<AudioFrame>;\n allowInterruptions?: boolean;\n addToChatCtx?: boolean;\n },\n ): SpeechHandle {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n const doSay = (activity: AgentActivity, nextActivity?: AgentActivity) => {\n if (activity.schedulingPaused) {\n if (!nextActivity) {\n throw new Error('AgentSession is closing, cannot use say()');\n }\n return nextActivity.say(text, options);\n }\n return activity.say(text, options);\n };\n\n const runState = this._globalRunState;\n let handle: SpeechHandle;\n\n // attach to the session span if called outside of the AgentSession\n const activeSpan = trace.getActiveSpan();\n if (!activeSpan && this.rootSpanContext) {\n handle = otelContext.with(this.rootSpanContext, () =>\n doSay(this.activity!, this.nextActivity),\n );\n } else {\n handle = doSay(this.activity, this.nextActivity);\n }\n\n if (runState) {\n runState._watchHandle(handle);\n }\n\n return handle;\n }\n\n interrupt(options?: { force?: boolean }) {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n return this.activity.interrupt(options);\n }\n\n generateReply(options?: {\n userInput?: string;\n instructions?: string;\n toolChoice?: ToolChoice;\n allowInterruptions?: boolean;\n }): SpeechHandle {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n const userMessage = options?.userInput\n ? new ChatMessage({\n role: 'user',\n content: options.userInput,\n })\n : undefined;\n\n const doGenerateReply = (activity: AgentActivity, nextActivity?: AgentActivity) => {\n if (activity.schedulingPaused) {\n if (!nextActivity) {\n throw new Error('AgentSession is closing, cannot use generateReply()');\n }\n return nextActivity.generateReply({ userMessage, ...options });\n }\n return activity.generateReply({ userMessage, ...options });\n };\n\n // attach to the session span if called outside of the AgentSession\n const activeSpan = trace.getActiveSpan();\n let handle: SpeechHandle;\n if (!activeSpan && this.rootSpanContext) {\n handle = otelContext.with(this.rootSpanContext, () =>\n doGenerateReply(this.activity!, this.nextActivity),\n );\n } else {\n handle = doGenerateReply(this.activity!, this.nextActivity);\n }\n\n if (this._globalRunState) {\n this._globalRunState._watchHandle(handle);\n }\n\n return handle;\n }\n\n /**\n * Run a test with user input and return a result for assertions.\n *\n * This method is primarily used for testing agent behavior without\n * requiring a real room connection.\n *\n * @example\n * ```typescript\n * const result = await session.run({ userInput: 'Hello' });\n * result.expect.nextEvent().isMessage({ role: 'assistant' });\n * result.expect.noMoreEvents();\n * ```\n *\n * @param options - Run options including user input and optional output type\n * @returns A RunResult that resolves when the agent finishes responding\n */\n run<T = unknown>({\n userInput,\n outputType,\n }: {\n userInput: string;\n outputType?: z.ZodType<T>;\n }): RunResult<T> {\n if (this._globalRunState && !this._globalRunState.done()) {\n throw new Error('nested runs are not supported');\n }\n\n const runState = new RunResult<T>({\n userInput,\n outputType,\n });\n\n this._globalRunState = runState;\n\n // Defer generateReply through the activityLock to ensure any in-progress\n // activity transition (e.g. AgentTask started from onEnter) completes first.\n // TS Task.from starts onEnter synchronously, so the transition may already be\n // mid-flight by the time run() is called after session.start() resolves.\n // Acquiring and immediately releasing the lock guarantees FIFO ordering:\n // the transition's lock section finishes before we route generateReply.\n (async () => {\n try {\n const unlock = await this.activityLock.lock();\n unlock();\n this.generateReply({ userInput });\n } catch (e) {\n runState._reject(e instanceof Error ? e : new Error(String(e)));\n }\n })();\n\n return runState;\n }\n\n /** @internal */\n async _updateActivity(agent: Agent, options: ActivityTransitionOptions = {}): Promise<void> {\n const { previousActivity = 'close', newActivity = 'start', blockedTasks = [] } = options;\n const waitOnEnter = options.waitOnEnter ?? newActivity === 'start';\n\n const runWithContext = async () => {\n const unlock = await this.activityLock.lock();\n let onEnterTask: Task<void> | undefined;\n\n try {\n this.agent = agent;\n const prevActivityObj = this.activity;\n\n if (newActivity === 'start') {\n const prevAgent = prevActivityObj?.agent;\n if (\n agent._agentActivity &&\n // allow updating the same agent that is running\n (agent !== prevAgent || previousActivity !== 'close')\n ) {\n throw new Error('Cannot start agent: an activity is already running');\n }\n this.nextActivity = new AgentActivity(agent, this);\n } else if (newActivity === 'resume') {\n if (!agent._agentActivity) {\n throw new Error('Cannot resume agent: no existing activity to resume');\n }\n this.nextActivity = agent._agentActivity;\n }\n\n if (prevActivityObj && prevActivityObj !== this.nextActivity) {\n if (previousActivity === 'pause') {\n await prevActivityObj.pause({ blockedTasks });\n } else {\n await prevActivityObj.drain();\n await prevActivityObj.close();\n }\n }\n\n this.activity = this.nextActivity;\n this.nextActivity = undefined;\n\n const runState = this._globalRunState;\n const handoffItem = new AgentHandoffItem({\n oldAgentId: prevActivityObj?.agent.id,\n newAgentId: agent.id,\n });\n\n if (runState) {\n runState._agentHandoff({\n item: handoffItem,\n oldAgent: prevActivityObj?.agent,\n newAgent: this.activity!.agent,\n });\n }\n\n this._chatCtx.insert(handoffItem);\n this.logger.debug(\n { previousAgentId: prevActivityObj?.agent.id, newAgentId: agent.id },\n 'Agent handoff inserted into chat context',\n );\n\n if (newActivity === 'start') {\n await this.activity!.start();\n } else {\n await this.activity!.resume();\n }\n\n onEnterTask = this.activity!._onEnterTask;\n\n if (this._input.audio) {\n this.activity!.attachAudioInput(this._input.audio.stream);\n }\n } finally {\n unlock();\n }\n\n if (waitOnEnter) {\n if (!onEnterTask) {\n throw new Error('expected onEnter task to be available while waitOnEnter=true');\n }\n await onEnterTask.result;\n }\n };\n\n // Run within session span context if available\n if (this.rootSpanContext) {\n return otelContext.with(this.rootSpanContext, runWithContext);\n }\n\n return runWithContext();\n }\n\n get chatCtx(): ChatContext {\n return this._chatCtx.copy();\n }\n\n get agentState(): AgentState {\n return this._agentState;\n }\n\n get currentAgent(): Agent {\n if (!this.agent) {\n throw new Error('AgentSession is not running');\n }\n\n return this.agent;\n }\n\n async close(): Promise<void> {\n await this.closeImpl(CloseReason.USER_INITIATED);\n }\n\n shutdown(options?: { drain?: boolean; reason?: ShutdownReason }): void {\n const { drain = true, reason = CloseReason.USER_INITIATED } = options ?? {};\n\n this._closeSoon({\n reason,\n drain,\n });\n }\n\n /** @internal */\n _closeSoon({\n reason,\n drain = false,\n error = null,\n }: {\n reason: ShutdownReason;\n drain?: boolean;\n error?: RealtimeModelError | STTError | TTSError | LLMError | null;\n }): void {\n if (this.closingTask) {\n return;\n }\n this.closeImpl(reason, error, drain);\n }\n\n /** @internal */\n _onError(error: RealtimeModelError | STTError | TTSError | LLMError): void {\n if (this.closingTask || error.recoverable) {\n return;\n }\n\n // Track error counts per type to implement max_unrecoverable_errors logic\n if (error.type === 'llm_error') {\n this.llmErrorCounts += 1;\n if (this.llmErrorCounts <= this._connOptions.maxUnrecoverableErrors) {\n return;\n }\n } else if (error.type === 'tts_error') {\n this.ttsErrorCounts += 1;\n if (this.ttsErrorCounts <= this._connOptions.maxUnrecoverableErrors) {\n return;\n }\n }\n\n this.logger.error(error, 'AgentSession is closing due to unrecoverable error');\n\n this.closingTask = (async () => {\n await this.closeImpl(CloseReason.ERROR, error);\n })().then(() => {\n this.closingTask = null;\n });\n }\n\n /** @internal */\n _conversationItemAdded(item: ChatMessage): void {\n this._chatCtx.insert(item);\n this.emit(AgentSessionEventTypes.ConversationItemAdded, createConversationItemAddedEvent(item));\n }\n\n /** @internal */\n _toolItemsAdded(items: (FunctionCall | FunctionCallOutput)[]): void {\n this._chatCtx.insert(items);\n }\n\n /** @internal */\n _updateAgentState(state: AgentState, options?: { startTime?: number; otelContext?: Context }) {\n if (this._agentState === state) {\n return;\n }\n\n if (state === 'speaking') {\n // Reset error counts when agent starts speaking\n this.llmErrorCounts = 0;\n this.ttsErrorCounts = 0;\n\n if (this.agentSpeakingSpan === undefined) {\n this.agentSpeakingSpan = tracer.startSpan({\n name: 'agent_speaking',\n context: options?.otelContext ?? this.rootSpanContext,\n startTime: options?.startTime,\n });\n\n const localParticipant = this._roomIO?.localParticipant;\n if (localParticipant) {\n setParticipantSpanAttributes(this.agentSpeakingSpan, localParticipant);\n }\n }\n } else if (this.agentSpeakingSpan !== undefined) {\n // TODO(brian): PR4 - Set ATTR_END_TIME attribute if available\n this.agentSpeakingSpan.end();\n this.agentSpeakingSpan = undefined;\n }\n\n const oldState = this._agentState;\n this._agentState = state;\n\n // Handle user away timer based on state changes\n if (state === 'listening' && this.userState === 'listening') {\n this._setUserAwayTimer();\n } else {\n this._cancelUserAwayTimer();\n }\n\n this.emit(\n AgentSessionEventTypes.AgentStateChanged,\n createAgentStateChangedEvent(oldState, state),\n );\n }\n\n /** @internal */\n _updateUserState(state: UserState, lastSpeakingTime?: number) {\n if (this.userState === state) {\n return;\n }\n\n if (state === 'speaking' && this.userSpeakingSpan === undefined) {\n this.userSpeakingSpan = tracer.startSpan({\n name: 'user_speaking',\n context: this.rootSpanContext,\n startTime: lastSpeakingTime,\n });\n\n const linked = this._roomIO?.linkedParticipant;\n if (linked) {\n setParticipantSpanAttributes(this.userSpeakingSpan, linked);\n }\n } else if (this.userSpeakingSpan !== undefined) {\n this.userSpeakingSpan.end(lastSpeakingTime);\n this.userSpeakingSpan = undefined;\n }\n\n const oldState = this.userState;\n this.userState = state;\n\n // Handle user away timer based on state changes\n if (state === 'listening' && this._agentState === 'listening') {\n this._setUserAwayTimer();\n } else {\n this._cancelUserAwayTimer();\n }\n\n this.emit(\n AgentSessionEventTypes.UserStateChanged,\n createUserStateChangedEvent(oldState, state),\n );\n }\n\n // -- User changed input/output streams/sinks --\n private onAudioInputChanged(): void {\n if (!this.started) {\n return;\n }\n\n if (this.activity && this._input.audio) {\n this.activity.attachAudioInput(this._input.audio.stream);\n }\n }\n\n private onAudioOutputChanged(): void {}\n\n private onTextOutputChanged(): void {}\n\n private _setUserAwayTimer(): void {\n this._cancelUserAwayTimer();\n\n if (this.options.userAwayTimeout === null || this.options.userAwayTimeout === undefined) {\n return;\n }\n\n if (this._roomIO && !this._roomIO.isParticipantAvailable) {\n return;\n }\n\n this.userAwayTimer = setTimeout(() => {\n this.logger.debug('User away timeout triggered');\n this._updateUserState('away');\n }, this.options.userAwayTimeout * 1000);\n }\n\n private _cancelUserAwayTimer(): void {\n if (this.userAwayTimer !== null) {\n clearTimeout(this.userAwayTimer);\n this.userAwayTimer = null;\n }\n }\n\n private _onUserInputTranscribed(ev: UserInputTranscribedEvent): void {\n if (this.userState === 'away' && ev.isFinal) {\n this.logger.debug('User returned from away state due to speech input');\n this._updateUserState('listening');\n }\n }\n\n private async closeImpl(\n reason: ShutdownReason,\n error: RealtimeModelError | LLMError | TTSError | STTError | null = null,\n drain: boolean = false,\n ): Promise<void> {\n if (this.rootSpanContext) {\n return otelContext.with(this.rootSpanContext, async () => {\n await this.closeImplInner(reason, error, drain);\n });\n }\n\n return this.closeImplInner(reason, error, drain);\n }\n\n private async closeImplInner(\n reason: ShutdownReason,\n error: RealtimeModelError | LLMError | TTSError | STTError | null = null,\n drain: boolean = false,\n ): Promise<void> {\n if (!this.started) {\n return;\n }\n\n this._cancelUserAwayTimer();\n this.off(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);\n\n if (this.activity) {\n if (!drain) {\n try {\n await this.activity.interrupt({ force: true }).await;\n } catch (error) {\n // Uninterruptible speech can throw during forced interruption.\n this.logger.warn({ error }, 'Error interrupting activity');\n }\n }\n\n await this.activity.drain();\n // wait any uninterruptible speech to finish\n await this.activity.currentSpeech?.waitForPlayout();\n\n if (reason !== CloseReason.ERROR) {\n this.activity.commitUserTurn({ audioDetached: true, throwIfNotReady: false });\n }\n\n try {\n this.activity.detachAudioInput();\n } catch (error) {\n // Ignore detach errors during cleanup - source may not have been set\n }\n }\n\n // Close recorder before detaching inputs/outputs (keep reference for session report)\n if (this._recorderIO) {\n await this._recorderIO.close();\n }\n\n // detach the inputs and outputs\n this.input.audio = null;\n this.output.audio = null;\n this.output.transcription = null;\n\n await this._roomIO?.close();\n this._roomIO = undefined;\n\n await this.activity?.close();\n this.activity = undefined;\n\n if (this.sessionSpan) {\n this.sessionSpan.end();\n this.sessionSpan = undefined;\n }\n\n if (this.userSpeakingSpan) {\n this.userSpeakingSpan.end();\n this.userSpeakingSpan = undefined;\n }\n\n if (this.agentSpeakingSpan) {\n this.agentSpeakingSpan.end();\n this.agentSpeakingSpan = undefined;\n }\n\n this.started = false;\n\n this.emit(AgentSessionEventTypes.Close, createCloseEvent(reason, error));\n\n this.userState = 'listening';\n this._agentState = 'initializing';\n this.rootSpanContext = undefined;\n this.llmErrorCounts = 0;\n this.ttsErrorCounts = 0;\n\n this.logger.info({ reason, error }, 'AgentSession closed');\n }\n}\n"],"mappings":"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","names":["import_utils","InferenceSTT","InferenceLLM","InferenceTTS","oldTask","agent","otelContext","error"]}
1
+ {"version":3,"sources":["../../src/voice/agent_session.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { AudioFrame, Room } from '@livekit/rtc-node';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport type { Context, Span } from '@opentelemetry/api';\nimport { ROOT_CONTEXT, context as otelContext, trace } from '@opentelemetry/api';\nimport { EventEmitter } from 'node:events';\nimport type { ReadableStream } from 'node:stream/web';\nimport type { z } from 'zod';\nimport {\n LLM as InferenceLLM,\n STT as InferenceSTT,\n TTS as InferenceTTS,\n type LLMModels,\n type STTModelString,\n type TTSModelString,\n} from '../inference/index.js';\nimport type { InterruptionDetectionError } from '../inference/interruption/errors.js';\nimport type { OverlappingSpeechEvent } from '../inference/interruption/types.js';\nimport { type JobContext, getJobContext } from '../job.js';\nimport type { FunctionCall, FunctionCallOutput } from '../llm/chat_context.js';\nimport { AgentHandoffItem, ChatContext, ChatMessage } from '../llm/chat_context.js';\nimport type { LLM, RealtimeModel, RealtimeModelError, ToolChoice } from '../llm/index.js';\nimport type { LLMError } from '../llm/llm.js';\nimport { log } from '../log.js';\nimport { type ModelUsage, ModelUsageCollector, filterZeroValues } from '../metrics/model_usage.js';\nimport type { STT } from '../stt/index.js';\nimport type { STTError } from '../stt/stt.js';\nimport { traceTypes, tracer } from '../telemetry/index.js';\nimport type { TTS, TTSError } from '../tts/tts.js';\nimport {\n DEFAULT_API_CONNECT_OPTIONS,\n DEFAULT_SESSION_CONNECT_OPTIONS,\n type ResolvedSessionConnectOptions,\n type SessionConnectOptions,\n} from '../types.js';\nimport { Task } from '../utils.js';\nimport type { VAD } from '../vad.js';\nimport type { Agent } from './agent.js';\nimport { AgentActivity } from './agent_activity.js';\nimport type { _TurnDetector } from './audio_recognition.js';\nimport { ClientEventsHandler } from './client_events.js';\nimport {\n type AgentEvent,\n AgentSessionEventTypes,\n type AgentState,\n type AgentStateChangedEvent,\n type CloseEvent,\n CloseReason,\n type ConversationItemAddedEvent,\n type ErrorEvent,\n type FunctionToolsExecutedEvent,\n type MetricsCollectedEvent,\n type ShutdownReason,\n type SpeechCreatedEvent,\n type UserInputTranscribedEvent,\n type UserState,\n type UserStateChangedEvent,\n createAgentStateChangedEvent,\n createCloseEvent,\n createConversationItemAddedEvent,\n createUserStateChangedEvent,\n} from './events.js';\nimport { AgentInput, AgentOutput } from './io.js';\nimport { RecorderIO } from './recorder_io/index.js';\nimport {\n DEFAULT_TEXT_INPUT_CALLBACK,\n RoomIO,\n type RoomInputOptions,\n type RoomOutputOptions,\n} from './room_io/index.js';\nimport type { UnknownUserData } from './run_context.js';\nimport type { SpeechHandle } from './speech_handle.js';\nimport { RunResult } from './testing/run_result.js';\nimport type { InterruptionOptions } from './turn_config/interruption.js';\nimport type {\n InternalTurnHandlingOptions,\n TurnHandlingOptions,\n} from './turn_config/turn_handling.js';\nimport { migrateLegacyOptions } from './turn_config/utils.js';\nimport { setParticipantSpanAttributes } from './utils.js';\n\nexport interface AgentSessionUsage {\n /** List of usage summaries, one per model/provider combination. */\n modelUsage: Array<Partial<ModelUsage>>;\n}\n\nexport interface SessionOptions {\n maxToolSteps: number;\n /**\n * Whether to speculatively begin LLM and TTS requests before an end-of-turn is detected.\n * When `true`, the agent sends inference calls as soon as a user transcript is received rather\n * than waiting for a definitive turn boundary. This can reduce response latency by overlapping\n * model inference with user audio, but may incur extra compute if the user interrupts or\n * revises mid-utterance.\n * @defaultValue false\n */\n preemptiveGeneration: boolean;\n\n /**\n * If set, set the user state as \"away\" after this amount of time after user and agent are\n * silent. Set to `null` to disable.\n * @defaultValue 15.0\n */\n userAwayTimeout: number | null;\n\n /**\n * Duration in milliseconds for AEC (Acoustic Echo Cancellation) warmup, during which\n * interruptions from audio activity are suppressed. Set to `null` to disable.\n * @defaultValue 3000\n */\n aecWarmupDuration: number | null;\n\n /**\n * Configuration for turn handling.\n */\n turnHandling: Partial<TurnHandlingOptions>;\n\n useTtsAlignedTranscript: boolean;\n\n /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.mode instead. */\n allowInterruptions?: boolean;\n /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.discardAudioIfUninterruptible instead. */\n discardAudioIfUninterruptible?: boolean;\n /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.minDuration instead. */\n minInterruptionDuration?: number;\n /** @deprecated Use {@link SessionOptions.turnHandling}.interruption.minWords instead. */\n minInterruptionWords?: number;\n /** @deprecated Use {@link SessionOptions.turnHandling}.endpointing.minDelay instead. */\n minEndpointingDelay?: number;\n /** @deprecated Use {@link SessionOptions.turnHandling}.endpointing.maxDelay instead. */\n maxEndpointingDelay?: number;\n}\n\nexport interface InternalSessionOptions extends SessionOptions {\n turnHandling: InternalTurnHandlingOptions;\n}\n\nexport const defaultSessionOptions = {\n maxToolSteps: 3,\n preemptiveGeneration: false,\n userAwayTimeout: 15.0,\n aecWarmupDuration: 3000,\n turnHandling: {},\n useTtsAlignedTranscript: true,\n} as const satisfies SessionOptions;\n\n/** @deprecated {@link VoiceOptions} has been renamed to {@link SessionOptions} */\nexport type VoiceOptions = SessionOptions;\n\nexport type TurnDetectionMode = 'stt' | 'vad' | 'realtime_llm' | 'manual' | _TurnDetector;\n\nexport type AgentSessionCallbacks = {\n [AgentSessionEventTypes.UserInputTranscribed]: (ev: UserInputTranscribedEvent) => void;\n [AgentSessionEventTypes.AgentStateChanged]: (ev: AgentStateChangedEvent) => void;\n [AgentSessionEventTypes.UserStateChanged]: (ev: UserStateChangedEvent) => void;\n [AgentSessionEventTypes.ConversationItemAdded]: (ev: ConversationItemAddedEvent) => void;\n [AgentSessionEventTypes.FunctionToolsExecuted]: (ev: FunctionToolsExecutedEvent) => void;\n [AgentSessionEventTypes.MetricsCollected]: (ev: MetricsCollectedEvent) => void;\n [AgentSessionEventTypes.SpeechCreated]: (ev: SpeechCreatedEvent) => void;\n [AgentSessionEventTypes.Error]: (ev: ErrorEvent) => void;\n [AgentSessionEventTypes.Close]: (ev: CloseEvent) => void;\n [AgentSessionEventTypes.UserOverlappingSpeech]: (ev: OverlappingSpeechEvent) => void;\n};\n\nexport type AgentSessionOptions<UserData = UnknownUserData> = {\n stt?: STT | STTModelString;\n vad?: VAD;\n llm?: LLM | RealtimeModel | LLMModels;\n tts?: TTS | TTSModelString;\n userData?: UserData;\n options?: Partial<SessionOptions>;\n connOptions?: SessionConnectOptions;\n\n /** @deprecated use {@link AgentSessionOptions.options}.turnHandling.turnDetection instead */\n turnDetection?: TurnDetectionMode;\n /** @deprecated use {@link AgentSessionOptions.options} instead */\n voiceOptions?: Partial<VoiceOptions>;\n};\n\ntype ActivityTransitionOptions = {\n previousActivity?: 'close' | 'pause';\n newActivity?: 'start' | 'resume';\n blockedTasks?: Task<any>[];\n waitOnEnter?: boolean;\n};\n\nexport class AgentSession<\n UserData = UnknownUserData,\n> extends (EventEmitter as new () => TypedEmitter<AgentSessionCallbacks>) {\n vad?: VAD;\n stt?: STT;\n llm?: LLM | RealtimeModel;\n tts?: TTS;\n turnDetection?: TurnDetectionMode;\n\n readonly options: InternalSessionOptions;\n private readonly activityLock = new Mutex();\n\n private agent?: Agent;\n private activity?: AgentActivity;\n private nextActivity?: AgentActivity;\n private updateActivityTask?: Task<void>;\n private started = false;\n private clientEventsHandler?: ClientEventsHandler;\n\n private _chatCtx: ChatContext;\n private _userData: UserData | undefined;\n private _userState: UserState = 'listening';\n private _agentState: AgentState = 'initializing';\n\n private _input: AgentInput;\n private _output: AgentOutput;\n\n private closingTask: Promise<void> | null = null;\n private userAwayTimer: NodeJS.Timeout | null = null;\n\n private _aecWarmupTimer: NodeJS.Timeout | null = null;\n\n // Connection options for STT, LLM, and TTS\n private _connOptions: ResolvedSessionConnectOptions;\n\n // Unrecoverable error counts, reset after agent speaking\n private llmErrorCounts = 0;\n private ttsErrorCounts = 0;\n private interruptionDetectionErrorCounts = 0;\n\n private sessionSpan?: Span;\n private agentSpeakingSpan?: Span;\n\n private _interruptionDetection?: InterruptionOptions['mode'];\n\n private _usageCollector: ModelUsageCollector = new ModelUsageCollector();\n\n /** @internal */\n _roomIO?: RoomIO;\n\n /** @internal */\n _aecWarmupRemaining = 0;\n\n /** @internal */\n _recorderIO?: RecorderIO;\n\n /** @internal */\n rootSpanContext?: Context;\n\n /** @internal */\n _recordedEvents: AgentEvent[] = [];\n\n /** @internal */\n _enableRecording = false;\n\n /** @internal - Timestamp when the session started (milliseconds) */\n _startedAt?: number;\n\n /** @internal - Current run state for testing */\n _globalRunState?: RunResult;\n\n /** @internal */\n _userSpeakingSpan?: Span;\n\n private logger = log();\n\n constructor(options: AgentSessionOptions<UserData>) {\n super();\n\n const opts = migrateLegacyOptions<UserData>(options);\n\n const { vad, stt, llm, tts, userData, connOptions, options: sessionOptions } = opts;\n // Merge user-provided connOptions with defaults\n this._connOptions = {\n sttConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.sttConnOptions },\n llmConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.llmConnOptions },\n ttsConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.ttsConnOptions },\n maxUnrecoverableErrors:\n connOptions?.maxUnrecoverableErrors ??\n DEFAULT_SESSION_CONNECT_OPTIONS.maxUnrecoverableErrors,\n };\n\n this.vad = vad;\n\n if (typeof stt === 'string') {\n this.stt = InferenceSTT.fromModelString(stt);\n } else {\n this.stt = stt;\n }\n\n if (typeof llm === 'string') {\n this.llm = InferenceLLM.fromModelString(llm);\n } else {\n this.llm = llm;\n }\n\n if (typeof tts === 'string') {\n this.tts = InferenceTTS.fromModelString(tts);\n } else {\n this.tts = tts;\n }\n\n this.turnDetection = sessionOptions?.turnHandling?.turnDetection;\n this._interruptionDetection = sessionOptions?.turnHandling?.interruption?.mode;\n this._userData = userData;\n\n // configurable IO\n this._input = new AgentInput(this.onAudioInputChanged);\n this._output = new AgentOutput(this.onAudioOutputChanged, this.onTextOutputChanged);\n\n // This is the \"global\" chat context, it holds the entire conversation history\n this._chatCtx = ChatContext.empty();\n this.options = opts.options;\n this._aecWarmupRemaining = this.options.aecWarmupDuration ?? 0;\n\n this._onUserInputTranscribed = this._onUserInputTranscribed.bind(this);\n this.on(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);\n }\n\n emit<K extends keyof AgentSessionCallbacks>(\n event: K,\n ...args: Parameters<AgentSessionCallbacks[K]>\n ): boolean {\n const eventData = args[0] as AgentEvent;\n this._recordedEvents.push(eventData);\n if (event === AgentSessionEventTypes.MetricsCollected) {\n this._usageCollector.collect((eventData as MetricsCollectedEvent).metrics);\n }\n return super.emit(event, ...args);\n }\n\n get input(): AgentInput {\n return this._input;\n }\n\n get output(): AgentOutput {\n return this._output;\n }\n\n get userData(): UserData {\n if (this._userData === undefined) {\n throw new Error('Voice agent userData is not set');\n }\n\n return this._userData;\n }\n\n get history(): ChatContext {\n return this._chatCtx;\n }\n\n /** Connection options for STT, LLM, and TTS. */\n get connOptions(): ResolvedSessionConnectOptions {\n return this._connOptions;\n }\n\n get interruptionDetection() {\n return this._interruptionDetection;\n }\n\n /**\n * Returns usage summaries for this session, one per model/provider combination.\n */\n get usage(): AgentSessionUsage {\n // Skip zero fields for more concise usage display (matches python behavior).\n return { modelUsage: this._usageCollector.flatten().map(filterZeroValues) };\n }\n\n get useTtsAlignedTranscript(): boolean {\n return this.options.useTtsAlignedTranscript;\n }\n\n set userData(value: UserData) {\n this._userData = value;\n }\n\n private async _startImpl({\n agent,\n room,\n inputOptions,\n outputOptions,\n span,\n }: {\n agent: Agent;\n room?: Room;\n inputOptions?: Partial<RoomInputOptions>;\n outputOptions?: Partial<RoomOutputOptions>;\n span: Span;\n }): Promise<void> {\n span.setAttribute(traceTypes.ATTR_AGENT_LABEL, agent.id);\n\n this.agent = agent;\n this._updateAgentState('initializing');\n\n const tasks: Promise<void>[] = [];\n\n if (room && !this._roomIO) {\n // Check for existing input/output configuration and warn if needed\n if (this.input.audio && inputOptions?.audioEnabled !== false) {\n this.logger.warn(\n 'RoomIO audio input is enabled but input.audio is already set, ignoring..',\n );\n }\n\n if (this.output.audio && outputOptions?.audioEnabled !== false) {\n this.logger.warn(\n 'RoomIO audio output is enabled but output.audio is already set, ignoring..',\n );\n }\n\n if (this.output.transcription && outputOptions?.transcriptionEnabled !== false) {\n this.logger.warn(\n 'RoomIO transcription output is enabled but output.transcription is already set, ignoring..',\n );\n }\n\n this._roomIO = new RoomIO({\n agentSession: this,\n room,\n inputOptions,\n outputOptions,\n });\n\n this._roomIO.start();\n\n this.clientEventsHandler = new ClientEventsHandler(this, this._roomIO);\n if (inputOptions?.textEnabled !== false) {\n this.clientEventsHandler.registerTextInput(\n inputOptions?.textInputCallback ?? DEFAULT_TEXT_INPUT_CALLBACK,\n );\n }\n }\n\n let ctx: JobContext | undefined = undefined;\n try {\n ctx = getJobContext();\n } catch {\n // JobContext is not available in evals\n }\n\n if (ctx) {\n if (room && ctx.room === room && !room.isConnected) {\n this.logger.debug('Auto-connecting to room via job context');\n tasks.push(ctx.connect());\n }\n\n if (ctx._primaryAgentSession === undefined) {\n ctx._primaryAgentSession = this;\n } else if (this._enableRecording) {\n throw new Error(\n 'Only one `AgentSession` can be the primary at a time. If you want to ignore primary designation, use `session.start({ record: false })`.',\n );\n }\n\n if (this.input.audio && this.output.audio && this._enableRecording) {\n this._recorderIO = new RecorderIO({ agentSession: this });\n this.input.audio = this._recorderIO.recordInput(this.input.audio);\n this.output.audio = this._recorderIO.recordOutput(this.output.audio);\n\n // Start recording to session directory\n const sessionDir = ctx.sessionDirectory;\n if (sessionDir) {\n tasks.push(this._recorderIO.start(`${sessionDir}/audio.ogg`));\n }\n }\n }\n\n // TODO(AJS-265): add shutdown callback to job context\n // Initial start does not wait on onEnter\n tasks.push(this._updateActivity(this.agent, { waitOnEnter: false }));\n\n await Promise.allSettled(tasks);\n\n if (this.clientEventsHandler) {\n await this.clientEventsHandler.start();\n }\n\n // Log used IO configuration\n this.logger.debug(\n `using audio io: ${this.input.audio ? '`' + this.input.audio.constructor.name + '`' : '(none)'} -> \\`AgentSession\\` -> ${this.output.audio ? '`' + this.output.audio.constructor.name + '`' : '(none)'}`,\n );\n\n this.logger.debug(\n `using transcript io: \\`AgentSession\\` -> ${this.output.transcription ? '`' + this.output.transcription.constructor.name + '`' : '(none)'}`,\n );\n\n this.started = true;\n this._startedAt = Date.now();\n this._updateAgentState('listening');\n }\n\n async start({\n agent,\n room,\n inputOptions,\n outputOptions,\n record,\n }: {\n agent: Agent;\n room?: Room;\n inputOptions?: Partial<RoomInputOptions>;\n outputOptions?: Partial<RoomOutputOptions>;\n record?: boolean;\n }): Promise<void> {\n if (this.started) {\n return;\n }\n\n this._usageCollector = new ModelUsageCollector();\n\n let ctx: JobContext | undefined = undefined;\n try {\n ctx = getJobContext();\n\n if (record === undefined) {\n record = ctx.job.enableRecording;\n }\n\n this._enableRecording = record;\n\n if (this._enableRecording) {\n ctx.initRecording();\n }\n } catch (error) {\n // JobContext is not available in evals\n this.logger.warn('JobContext is not available');\n }\n\n this.sessionSpan = tracer.startSpan({\n name: 'agent_session',\n context: ROOT_CONTEXT,\n });\n\n this.rootSpanContext = trace.setSpan(ROOT_CONTEXT, this.sessionSpan);\n\n await this._startImpl({\n agent,\n room,\n inputOptions,\n outputOptions,\n span: this.sessionSpan,\n });\n }\n\n updateAgent(agent: Agent): void {\n this.agent = agent;\n\n if (!this.started) {\n return;\n }\n\n const _updateActivityTask = async (oldTask: Task<void> | undefined, agent: Agent) => {\n if (oldTask) {\n try {\n await oldTask.result;\n } catch (error) {\n this.logger.error(error, 'previous updateAgent transition failed');\n }\n }\n\n await this._updateActivity(agent);\n };\n\n const oldTask = this.updateActivityTask;\n this.updateActivityTask = Task.from(\n async () => _updateActivityTask(oldTask, agent),\n undefined,\n 'AgentSession_updateActivityTask',\n );\n\n const runState = this._globalRunState;\n if (runState) {\n // Don't mark the RunResult as done, if there is currently an agent transition happening.\n // (used to make sure we're correctly adding the AgentHandoffResult before completion)\n runState._watchHandle(this.updateActivityTask);\n }\n }\n\n commitUserTurn() {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n this.activity.commitUserTurn();\n }\n\n clearUserTurn() {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n this.activity.clearUserTurn();\n }\n\n say(\n text: string | ReadableStream<string>,\n options?: {\n audio?: ReadableStream<AudioFrame>;\n allowInterruptions?: boolean;\n addToChatCtx?: boolean;\n },\n ): SpeechHandle {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n const doSay = (activity: AgentActivity, nextActivity?: AgentActivity) => {\n if (activity.schedulingPaused) {\n if (!nextActivity) {\n throw new Error('AgentSession is closing, cannot use say()');\n }\n return nextActivity.say(text, options);\n }\n return activity.say(text, options);\n };\n\n const runState = this._globalRunState;\n let handle: SpeechHandle;\n\n // attach to the session span if called outside of the AgentSession\n const activeSpan = trace.getActiveSpan();\n if (!activeSpan && this.rootSpanContext) {\n handle = otelContext.with(this.rootSpanContext, () =>\n doSay(this.activity!, this.nextActivity),\n );\n } else {\n handle = doSay(this.activity, this.nextActivity);\n }\n\n if (runState) {\n runState._watchHandle(handle);\n }\n\n return handle;\n }\n\n interrupt(options?: { force?: boolean }) {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n return this.activity.interrupt(options);\n }\n\n generateReply(options?: {\n userInput?: string;\n instructions?: string;\n toolChoice?: ToolChoice;\n allowInterruptions?: boolean;\n }): SpeechHandle {\n if (!this.activity) {\n throw new Error('AgentSession is not running');\n }\n\n const userMessage = options?.userInput\n ? new ChatMessage({\n role: 'user',\n content: options.userInput,\n })\n : undefined;\n\n const doGenerateReply = (activity: AgentActivity, nextActivity?: AgentActivity) => {\n if (activity.schedulingPaused) {\n if (!nextActivity) {\n throw new Error('AgentSession is closing, cannot use generateReply()');\n }\n return nextActivity.generateReply({ userMessage, ...options });\n }\n return activity.generateReply({ userMessage, ...options });\n };\n\n // attach to the session span if called outside of the AgentSession\n const activeSpan = trace.getActiveSpan();\n let handle: SpeechHandle;\n if (!activeSpan && this.rootSpanContext) {\n handle = otelContext.with(this.rootSpanContext, () =>\n doGenerateReply(this.activity!, this.nextActivity),\n );\n } else {\n handle = doGenerateReply(this.activity!, this.nextActivity);\n }\n\n if (this._globalRunState) {\n this._globalRunState._watchHandle(handle);\n }\n\n return handle;\n }\n\n /**\n * Run a test with user input and return a result for assertions.\n *\n * This method is primarily used for testing agent behavior without\n * requiring a real room connection.\n *\n * @example\n * ```typescript\n * const result = await session.run({ userInput: 'Hello' });\n * result.expect.nextEvent().isMessage({ role: 'assistant' });\n * result.expect.noMoreEvents();\n * ```\n *\n * @param options - Run options including user input and optional output type\n * @returns A RunResult that resolves when the agent finishes responding\n */\n run<T = unknown>({\n userInput,\n outputType,\n }: {\n userInput: string;\n outputType?: z.ZodType<T>;\n }): RunResult<T> {\n if (this._globalRunState && !this._globalRunState.done()) {\n throw new Error('nested runs are not supported');\n }\n\n const runState = new RunResult<T>({\n userInput,\n outputType,\n });\n\n this._globalRunState = runState;\n\n // Defer generateReply through the activityLock to ensure any in-progress\n // activity transition (e.g. AgentTask started from onEnter) completes first.\n // TS Task.from starts onEnter synchronously, so the transition may already be\n // mid-flight by the time run() is called after session.start() resolves.\n // Acquiring and immediately releasing the lock guarantees FIFO ordering:\n // the transition's lock section finishes before we route generateReply.\n (async () => {\n try {\n const unlock = await this.activityLock.lock();\n unlock();\n this.generateReply({ userInput });\n } catch (e) {\n runState._reject(e instanceof Error ? e : new Error(String(e)));\n }\n })();\n\n return runState;\n }\n\n /** @internal */\n async _updateActivity(agent: Agent, options: ActivityTransitionOptions = {}): Promise<void> {\n const { previousActivity = 'close', newActivity = 'start', blockedTasks = [] } = options;\n const waitOnEnter = options.waitOnEnter ?? newActivity === 'start';\n\n const runWithContext = async () => {\n const unlock = await this.activityLock.lock();\n let onEnterTask: Task<void> | undefined;\n\n try {\n this.agent = agent;\n const prevActivityObj = this.activity;\n\n if (newActivity === 'start') {\n const prevAgent = prevActivityObj?.agent;\n if (\n agent._agentActivity &&\n // allow updating the same agent that is running\n (agent !== prevAgent || previousActivity !== 'close')\n ) {\n throw new Error('Cannot start agent: an activity is already running');\n }\n this.nextActivity = new AgentActivity(agent, this);\n } else if (newActivity === 'resume') {\n if (!agent._agentActivity) {\n throw new Error('Cannot resume agent: no existing activity to resume');\n }\n this.nextActivity = agent._agentActivity;\n }\n\n if (prevActivityObj && prevActivityObj !== this.nextActivity) {\n if (previousActivity === 'pause') {\n await prevActivityObj.pause({ blockedTasks });\n } else {\n await prevActivityObj.drain();\n await prevActivityObj.close();\n }\n }\n\n this.activity = this.nextActivity;\n this.nextActivity = undefined;\n\n const runState = this._globalRunState;\n const handoffItem = new AgentHandoffItem({\n oldAgentId: prevActivityObj?.agent.id,\n newAgentId: agent.id,\n });\n\n if (runState) {\n runState._agentHandoff({\n item: handoffItem,\n oldAgent: prevActivityObj?.agent,\n newAgent: this.activity!.agent,\n });\n }\n\n this._chatCtx.insert(handoffItem);\n this.logger.debug(\n { previousAgentId: prevActivityObj?.agent.id, newAgentId: agent.id },\n 'Agent handoff inserted into chat context',\n );\n\n if (newActivity === 'start') {\n await this.activity!.start();\n } else {\n await this.activity!.resume();\n }\n\n onEnterTask = this.activity!._onEnterTask;\n\n if (this._input.audio) {\n this.activity!.attachAudioInput(this._input.audio.stream);\n }\n } finally {\n unlock();\n }\n\n if (waitOnEnter) {\n if (!onEnterTask) {\n throw new Error('expected onEnter task to be available while waitOnEnter=true');\n }\n await onEnterTask.result;\n }\n };\n\n // Run within session span context if available\n if (this.rootSpanContext) {\n return otelContext.with(this.rootSpanContext, runWithContext);\n }\n\n return runWithContext();\n }\n\n get chatCtx(): ChatContext {\n return this._chatCtx.copy();\n }\n\n get agentState(): AgentState {\n return this._agentState;\n }\n\n get userState(): UserState {\n return this._userState;\n }\n\n get currentAgent(): Agent {\n if (!this.agent) {\n throw new Error('AgentSession is not running');\n }\n\n return this.agent;\n }\n\n async close(): Promise<void> {\n await this.closeImpl(CloseReason.USER_INITIATED);\n }\n\n shutdown(options?: { drain?: boolean; reason?: ShutdownReason }): void {\n const { drain = true, reason = CloseReason.USER_INITIATED } = options ?? {};\n\n this._closeSoon({\n reason,\n drain,\n });\n }\n\n /** @internal */\n _closeSoon({\n reason,\n drain = false,\n error = null,\n }: {\n reason: ShutdownReason;\n drain?: boolean;\n error?: RealtimeModelError | STTError | TTSError | LLMError | null;\n }): void {\n if (this.closingTask) {\n return;\n }\n this.closeImpl(reason, error, drain);\n }\n\n /** @internal */\n _onError(\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError,\n ): void {\n if (this.closingTask || error.recoverable) {\n return;\n }\n\n // Track error counts per type to implement max_unrecoverable_errors logic\n if (error.type === 'llm_error') {\n this.llmErrorCounts += 1;\n if (this.llmErrorCounts <= this._connOptions.maxUnrecoverableErrors) {\n return;\n }\n } else if (error.type === 'tts_error') {\n this.ttsErrorCounts += 1;\n if (this.ttsErrorCounts <= this._connOptions.maxUnrecoverableErrors) {\n return;\n }\n } else if (error.type === 'interruption_detection_error') {\n this.interruptionDetectionErrorCounts += 1;\n if (this.interruptionDetectionErrorCounts <= this._connOptions.maxUnrecoverableErrors) {\n return;\n }\n }\n\n this.logger.error(error, 'AgentSession is closing due to unrecoverable error');\n\n this.closingTask = (async () => {\n await this.closeImpl(CloseReason.ERROR, error);\n })().then(() => {\n this.closingTask = null;\n });\n }\n\n /** @internal */\n _conversationItemAdded(item: ChatMessage): void {\n this._chatCtx.insert(item);\n this.emit(AgentSessionEventTypes.ConversationItemAdded, createConversationItemAddedEvent(item));\n }\n\n /** @internal */\n _toolItemsAdded(items: (FunctionCall | FunctionCallOutput)[]): void {\n this._chatCtx.insert(items);\n }\n\n /** @internal */\n _updateAgentState(state: AgentState, options?: { startTime?: number; otelContext?: Context }) {\n if (this._agentState === state) {\n return;\n }\n\n if (state === 'speaking') {\n this.llmErrorCounts = 0;\n this.ttsErrorCounts = 0;\n this.interruptionDetectionErrorCounts = 0;\n\n if (this.agentSpeakingSpan === undefined) {\n this.agentSpeakingSpan = tracer.startSpan({\n name: 'agent_speaking',\n context: options?.otelContext ?? this.rootSpanContext,\n startTime: options?.startTime,\n });\n\n const localParticipant = this._roomIO?.localParticipant;\n if (localParticipant) {\n setParticipantSpanAttributes(this.agentSpeakingSpan, localParticipant);\n }\n }\n } else if (this.agentSpeakingSpan !== undefined) {\n // TODO(brian): PR4 - Set ATTR_END_TIME attribute if available\n this.agentSpeakingSpan.end();\n this.agentSpeakingSpan = undefined;\n }\n\n if (state === 'speaking' && this._aecWarmupRemaining > 0 && this._aecWarmupTimer === null) {\n this._aecWarmupTimer = setTimeout(() => this._onAecWarmupExpired(), this._aecWarmupRemaining);\n this.logger.debug(\n { warmupDurationMs: this._aecWarmupRemaining },\n 'aec warmup active, disabling interruptions',\n );\n }\n\n const oldState = this._agentState;\n this._agentState = state;\n\n // Handle user away timer based on state changes\n if (state === 'listening' && this._userState === 'listening') {\n this._setUserAwayTimer();\n } else {\n this._cancelUserAwayTimer();\n }\n\n this.emit(\n AgentSessionEventTypes.AgentStateChanged,\n createAgentStateChangedEvent(oldState, state),\n );\n }\n\n /** @internal */\n _updateUserState(state: UserState, lastSpeakingTime?: number) {\n if (this._userState === state) {\n return;\n }\n\n if (state === 'speaking' && this._userSpeakingSpan === undefined) {\n this._userSpeakingSpan = tracer.startSpan({\n name: 'user_speaking',\n context: this.rootSpanContext,\n startTime: lastSpeakingTime,\n });\n\n const linked = this._roomIO?.linkedParticipant;\n if (linked) {\n setParticipantSpanAttributes(this._userSpeakingSpan, linked);\n }\n } else if (this._userSpeakingSpan !== undefined) {\n this._userSpeakingSpan.end(lastSpeakingTime);\n this._userSpeakingSpan = undefined;\n }\n\n const oldState = this._userState;\n this._userState = state;\n\n // Handle user away timer based on state changes\n if (state === 'listening' && this._agentState === 'listening') {\n this._setUserAwayTimer();\n } else {\n this._cancelUserAwayTimer();\n }\n\n this.emit(\n AgentSessionEventTypes.UserStateChanged,\n createUserStateChangedEvent(oldState, state),\n );\n }\n\n // -- User changed input/output streams/sinks --\n private onAudioInputChanged(): void {\n if (!this.started) {\n return;\n }\n\n if (this.activity && this._input.audio) {\n this.activity.attachAudioInput(this._input.audio.stream);\n }\n }\n\n private onAudioOutputChanged(): void {}\n\n private onTextOutputChanged(): void {}\n\n private _setUserAwayTimer(): void {\n this._cancelUserAwayTimer();\n\n if (this.options.userAwayTimeout === null || this.options.userAwayTimeout === undefined) {\n return;\n }\n\n if (this._roomIO && !this._roomIO.isParticipantAvailable) {\n return;\n }\n\n this.userAwayTimer = setTimeout(() => {\n this.logger.debug('User away timeout triggered');\n this._updateUserState('away');\n }, this.options.userAwayTimeout * 1000);\n }\n\n private _cancelUserAwayTimer(): void {\n if (this.userAwayTimer !== null) {\n clearTimeout(this.userAwayTimer);\n this.userAwayTimer = null;\n }\n }\n\n /** @internal */\n _onAecWarmupExpired(): void {\n if (this._aecWarmupRemaining > 0) {\n this.logger.debug('aec warmup expired, re-enabling interruptions');\n }\n\n this._aecWarmupRemaining = 0;\n if (this._aecWarmupTimer !== null) {\n clearTimeout(this._aecWarmupTimer);\n this._aecWarmupTimer = null;\n }\n }\n\n private _onUserInputTranscribed(ev: UserInputTranscribedEvent): void {\n if (this._userState === 'away' && ev.isFinal) {\n this.logger.debug('User returned from away state due to speech input');\n this._updateUserState('listening');\n }\n }\n\n private async closeImpl(\n reason: ShutdownReason,\n error:\n | RealtimeModelError\n | LLMError\n | TTSError\n | STTError\n | InterruptionDetectionError\n | null = null,\n drain: boolean = false,\n ): Promise<void> {\n if (this.rootSpanContext) {\n return otelContext.with(this.rootSpanContext, async () => {\n await this.closeImplInner(reason, error, drain);\n });\n }\n\n return this.closeImplInner(reason, error, drain);\n }\n\n private async closeImplInner(\n reason: ShutdownReason,\n error:\n | RealtimeModelError\n | LLMError\n | TTSError\n | STTError\n | InterruptionDetectionError\n | null = null,\n drain: boolean = false,\n ): Promise<void> {\n if (!this.started) {\n return;\n }\n\n this._cancelUserAwayTimer();\n this._onAecWarmupExpired();\n this.off(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);\n\n if (this.activity) {\n if (!drain) {\n try {\n await this.activity.interrupt({ force: true }).await;\n } catch (error) {\n // Uninterruptible speech can throw during forced interruption.\n this.logger.warn({ error }, 'Error interrupting activity');\n }\n }\n\n await this.activity.drain();\n // wait any uninterruptible speech to finish\n await this.activity.currentSpeech?.waitForPlayout();\n\n if (reason !== CloseReason.ERROR) {\n this.activity.commitUserTurn({ audioDetached: true, throwIfNotReady: false });\n }\n\n try {\n this.activity.detachAudioInput();\n } catch (error) {\n // Ignore detach errors during cleanup - source may not have been set\n }\n }\n\n // Close recorder before detaching inputs/outputs (keep reference for session report)\n if (this._recorderIO) {\n await this._recorderIO.close();\n }\n\n // detach the inputs and outputs\n this.input.audio = null;\n this.output.audio = null;\n this.output.transcription = null;\n\n await this.clientEventsHandler?.close();\n this.clientEventsHandler = undefined;\n\n await this._roomIO?.close();\n this._roomIO = undefined;\n\n await this.activity?.close();\n this.activity = undefined;\n\n if (this.sessionSpan) {\n this.sessionSpan.end();\n this.sessionSpan = undefined;\n }\n\n if (this._userSpeakingSpan) {\n this._userSpeakingSpan.end();\n this._userSpeakingSpan = undefined;\n }\n\n if (this.agentSpeakingSpan) {\n this.agentSpeakingSpan.end();\n this.agentSpeakingSpan = undefined;\n }\n\n this.started = false;\n\n this.emit(AgentSessionEventTypes.Close, createCloseEvent(reason, error));\n\n this._userState = 'listening';\n this._agentState = 'initializing';\n this.rootSpanContext = undefined;\n this.llmErrorCounts = 0;\n this.ttsErrorCounts = 0;\n this.interruptionDetectionErrorCounts = 0;\n\n this.logger.info({ reason, error }, 'AgentSession closed');\n }\n}\n"],"mappings":"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","names":["import_utils","InferenceSTT","InferenceLLM","InferenceTTS","oldTask","agent","otelContext","error"]}