@livekit/agents 1.1.0-dev.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/dist/cli.cjs +2 -0
  2. package/dist/cli.cjs.map +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +2 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/constants.cjs +3 -0
  7. package/dist/constants.cjs.map +1 -1
  8. package/dist/constants.d.cts +1 -0
  9. package/dist/constants.d.ts +1 -0
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +2 -0
  12. package/dist/constants.js.map +1 -1
  13. package/dist/cpu.cjs +189 -0
  14. package/dist/cpu.cjs.map +1 -0
  15. package/dist/cpu.d.cts +24 -0
  16. package/dist/cpu.d.ts +24 -0
  17. package/dist/cpu.d.ts.map +1 -0
  18. package/dist/cpu.js +152 -0
  19. package/dist/cpu.js.map +1 -0
  20. package/dist/cpu.test.cjs +227 -0
  21. package/dist/cpu.test.cjs.map +1 -0
  22. package/dist/cpu.test.js +204 -0
  23. package/dist/cpu.test.js.map +1 -0
  24. package/dist/index.cjs +12 -10
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +13 -13
  27. package/dist/index.d.ts +13 -13
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +11 -10
  30. package/dist/index.js.map +1 -1
  31. package/dist/inference/interruption/defaults.cjs +1 -1
  32. package/dist/inference/interruption/defaults.cjs.map +1 -1
  33. package/dist/inference/interruption/defaults.d.cts +1 -1
  34. package/dist/inference/interruption/defaults.d.ts +1 -1
  35. package/dist/inference/interruption/defaults.d.ts.map +1 -1
  36. package/dist/inference/interruption/defaults.js +1 -1
  37. package/dist/inference/interruption/defaults.js.map +1 -1
  38. package/dist/inference/interruption/http_transport.cjs +44 -28
  39. package/dist/inference/interruption/http_transport.cjs.map +1 -1
  40. package/dist/inference/interruption/http_transport.d.ts.map +1 -1
  41. package/dist/inference/interruption/http_transport.js +45 -29
  42. package/dist/inference/interruption/http_transport.js.map +1 -1
  43. package/dist/inference/interruption/interruption_detector.cjs +22 -5
  44. package/dist/inference/interruption/interruption_detector.cjs.map +1 -1
  45. package/dist/inference/interruption/interruption_detector.d.cts +2 -2
  46. package/dist/inference/interruption/interruption_detector.d.ts +2 -2
  47. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -1
  48. package/dist/inference/interruption/interruption_detector.js +22 -5
  49. package/dist/inference/interruption/interruption_detector.js.map +1 -1
  50. package/dist/inference/interruption/interruption_stream.cjs +4 -4
  51. package/dist/inference/interruption/interruption_stream.cjs.map +1 -1
  52. package/dist/inference/interruption/interruption_stream.js +4 -4
  53. package/dist/inference/interruption/interruption_stream.js.map +1 -1
  54. package/dist/inference/interruption/types.cjs.map +1 -1
  55. package/dist/inference/interruption/types.d.cts +2 -2
  56. package/dist/inference/interruption/types.d.ts +2 -2
  57. package/dist/inference/interruption/types.d.ts.map +1 -1
  58. package/dist/inference/interruption/ws_transport.cjs +60 -47
  59. package/dist/inference/interruption/ws_transport.cjs.map +1 -1
  60. package/dist/inference/interruption/ws_transport.d.ts.map +1 -1
  61. package/dist/inference/interruption/ws_transport.js +60 -47
  62. package/dist/inference/interruption/ws_transport.js.map +1 -1
  63. package/dist/inference/llm.cjs.map +1 -1
  64. package/dist/inference/llm.d.cts +1 -1
  65. package/dist/inference/llm.d.ts +1 -1
  66. package/dist/inference/llm.d.ts.map +1 -1
  67. package/dist/inference/llm.js.map +1 -1
  68. package/dist/inference/stt.cjs +20 -12
  69. package/dist/inference/stt.cjs.map +1 -1
  70. package/dist/inference/stt.d.cts +3 -2
  71. package/dist/inference/stt.d.ts +3 -2
  72. package/dist/inference/stt.d.ts.map +1 -1
  73. package/dist/inference/stt.js +20 -12
  74. package/dist/inference/stt.js.map +1 -1
  75. package/dist/inference/stt.test.cjs +14 -0
  76. package/dist/inference/stt.test.cjs.map +1 -1
  77. package/dist/inference/stt.test.js +14 -0
  78. package/dist/inference/stt.test.js.map +1 -1
  79. package/dist/inference/tts.cjs +13 -4
  80. package/dist/inference/tts.cjs.map +1 -1
  81. package/dist/inference/tts.d.cts +8 -1
  82. package/dist/inference/tts.d.ts +8 -1
  83. package/dist/inference/tts.d.ts.map +1 -1
  84. package/dist/inference/tts.js +13 -4
  85. package/dist/inference/tts.js.map +1 -1
  86. package/dist/inference/tts.test.cjs +10 -0
  87. package/dist/inference/tts.test.cjs.map +1 -1
  88. package/dist/inference/tts.test.js +10 -0
  89. package/dist/inference/tts.test.js.map +1 -1
  90. package/dist/ipc/job_proc_lazy_main.cjs +41 -23
  91. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  92. package/dist/ipc/job_proc_lazy_main.js +41 -23
  93. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  94. package/dist/job.cjs +1 -1
  95. package/dist/job.cjs.map +1 -1
  96. package/dist/job.js +1 -1
  97. package/dist/job.js.map +1 -1
  98. package/dist/language.cjs +394 -0
  99. package/dist/language.cjs.map +1 -0
  100. package/dist/language.d.cts +15 -0
  101. package/dist/language.d.ts +15 -0
  102. package/dist/language.d.ts.map +1 -0
  103. package/dist/language.js +363 -0
  104. package/dist/language.js.map +1 -0
  105. package/dist/language.test.cjs +43 -0
  106. package/dist/language.test.cjs.map +1 -0
  107. package/dist/language.test.js +49 -0
  108. package/dist/language.test.js.map +1 -0
  109. package/dist/llm/index.cjs +2 -0
  110. package/dist/llm/index.cjs.map +1 -1
  111. package/dist/llm/index.d.cts +1 -1
  112. package/dist/llm/index.d.ts +1 -1
  113. package/dist/llm/index.d.ts.map +1 -1
  114. package/dist/llm/index.js +2 -0
  115. package/dist/llm/index.js.map +1 -1
  116. package/dist/stream/deferred_stream.cjs +6 -2
  117. package/dist/stream/deferred_stream.cjs.map +1 -1
  118. package/dist/stream/deferred_stream.d.ts.map +1 -1
  119. package/dist/stream/deferred_stream.js +6 -2
  120. package/dist/stream/deferred_stream.js.map +1 -1
  121. package/dist/stt/stt.cjs.map +1 -1
  122. package/dist/stt/stt.d.cts +2 -1
  123. package/dist/stt/stt.d.ts +2 -1
  124. package/dist/stt/stt.d.ts.map +1 -1
  125. package/dist/stt/stt.js.map +1 -1
  126. package/dist/utils.cjs +15 -0
  127. package/dist/utils.cjs.map +1 -1
  128. package/dist/utils.d.cts +8 -0
  129. package/dist/utils.d.ts +8 -0
  130. package/dist/utils.d.ts.map +1 -1
  131. package/dist/utils.js +13 -0
  132. package/dist/utils.js.map +1 -1
  133. package/dist/version.cjs +1 -1
  134. package/dist/version.js +1 -1
  135. package/dist/voice/agent.cjs +14 -17
  136. package/dist/voice/agent.cjs.map +1 -1
  137. package/dist/voice/agent.d.cts +10 -11
  138. package/dist/voice/agent.d.ts +10 -11
  139. package/dist/voice/agent.d.ts.map +1 -1
  140. package/dist/voice/agent.js +15 -18
  141. package/dist/voice/agent.js.map +1 -1
  142. package/dist/voice/agent.test.cjs +194 -0
  143. package/dist/voice/agent.test.cjs.map +1 -1
  144. package/dist/voice/agent.test.js +195 -1
  145. package/dist/voice/agent.test.js.map +1 -1
  146. package/dist/voice/agent_activity.cjs +116 -39
  147. package/dist/voice/agent_activity.cjs.map +1 -1
  148. package/dist/voice/agent_activity.d.cts +2 -0
  149. package/dist/voice/agent_activity.d.ts +2 -0
  150. package/dist/voice/agent_activity.d.ts.map +1 -1
  151. package/dist/voice/agent_activity.js +117 -40
  152. package/dist/voice/agent_activity.js.map +1 -1
  153. package/dist/voice/agent_activity.test.cjs +135 -0
  154. package/dist/voice/agent_activity.test.cjs.map +1 -0
  155. package/dist/voice/agent_activity.test.js +134 -0
  156. package/dist/voice/agent_activity.test.js.map +1 -0
  157. package/dist/voice/agent_session.cjs +38 -38
  158. package/dist/voice/agent_session.cjs.map +1 -1
  159. package/dist/voice/agent_session.d.cts +65 -56
  160. package/dist/voice/agent_session.d.ts +65 -56
  161. package/dist/voice/agent_session.d.ts.map +1 -1
  162. package/dist/voice/agent_session.js +37 -37
  163. package/dist/voice/agent_session.js.map +1 -1
  164. package/dist/voice/audio_recognition.cjs +106 -52
  165. package/dist/voice/audio_recognition.cjs.map +1 -1
  166. package/dist/voice/audio_recognition.d.cts +4 -2
  167. package/dist/voice/audio_recognition.d.ts +4 -2
  168. package/dist/voice/audio_recognition.d.ts.map +1 -1
  169. package/dist/voice/audio_recognition.js +106 -52
  170. package/dist/voice/audio_recognition.js.map +1 -1
  171. package/dist/voice/audio_recognition_span.test.cjs +84 -22
  172. package/dist/voice/audio_recognition_span.test.cjs.map +1 -1
  173. package/dist/voice/audio_recognition_span.test.js +90 -23
  174. package/dist/voice/audio_recognition_span.test.js.map +1 -1
  175. package/dist/voice/events.cjs +1 -1
  176. package/dist/voice/events.cjs.map +1 -1
  177. package/dist/voice/events.d.cts +4 -3
  178. package/dist/voice/events.d.ts +4 -3
  179. package/dist/voice/events.d.ts.map +1 -1
  180. package/dist/voice/events.js +1 -1
  181. package/dist/voice/events.js.map +1 -1
  182. package/dist/voice/index.cjs +9 -1
  183. package/dist/voice/index.cjs.map +1 -1
  184. package/dist/voice/index.d.cts +1 -1
  185. package/dist/voice/index.d.ts +1 -1
  186. package/dist/voice/index.d.ts.map +1 -1
  187. package/dist/voice/index.js +10 -1
  188. package/dist/voice/index.js.map +1 -1
  189. package/dist/voice/remote_session.cjs +922 -0
  190. package/dist/voice/remote_session.cjs.map +1 -0
  191. package/dist/voice/remote_session.d.cts +108 -0
  192. package/dist/voice/remote_session.d.ts +108 -0
  193. package/dist/voice/remote_session.d.ts.map +1 -0
  194. package/dist/voice/remote_session.js +887 -0
  195. package/dist/voice/remote_session.js.map +1 -0
  196. package/dist/voice/report.cjs +11 -10
  197. package/dist/voice/report.cjs.map +1 -1
  198. package/dist/voice/report.d.cts +5 -3
  199. package/dist/voice/report.d.ts +5 -3
  200. package/dist/voice/report.d.ts.map +1 -1
  201. package/dist/voice/report.js +11 -10
  202. package/dist/voice/report.js.map +1 -1
  203. package/dist/voice/report.test.cjs +15 -0
  204. package/dist/voice/report.test.cjs.map +1 -1
  205. package/dist/voice/report.test.js +15 -0
  206. package/dist/voice/report.test.js.map +1 -1
  207. package/dist/voice/room_io/room_io.cjs +39 -0
  208. package/dist/voice/room_io/room_io.cjs.map +1 -1
  209. package/dist/voice/room_io/room_io.d.cts +3 -1
  210. package/dist/voice/room_io/room_io.d.ts +3 -1
  211. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  212. package/dist/voice/room_io/room_io.js +40 -1
  213. package/dist/voice/room_io/room_io.js.map +1 -1
  214. package/dist/voice/turn_config/interruption.cjs.map +1 -1
  215. package/dist/voice/turn_config/interruption.d.cts +1 -1
  216. package/dist/voice/turn_config/interruption.d.ts +1 -1
  217. package/dist/voice/turn_config/interruption.d.ts.map +1 -1
  218. package/dist/voice/turn_config/interruption.js.map +1 -1
  219. package/dist/voice/turn_config/utils.cjs +95 -35
  220. package/dist/voice/turn_config/utils.cjs.map +1 -1
  221. package/dist/voice/turn_config/utils.d.cts +17 -5
  222. package/dist/voice/turn_config/utils.d.ts +17 -5
  223. package/dist/voice/turn_config/utils.d.ts.map +1 -1
  224. package/dist/voice/turn_config/utils.js +93 -35
  225. package/dist/voice/turn_config/utils.js.map +1 -1
  226. package/dist/voice/turn_config/utils.test.cjs +83 -41
  227. package/dist/voice/turn_config/utils.test.cjs.map +1 -1
  228. package/dist/voice/turn_config/utils.test.js +84 -42
  229. package/dist/voice/turn_config/utils.test.js.map +1 -1
  230. package/dist/worker.cjs +6 -29
  231. package/dist/worker.cjs.map +1 -1
  232. package/dist/worker.d.ts.map +1 -1
  233. package/dist/worker.js +6 -19
  234. package/dist/worker.js.map +1 -1
  235. package/package.json +3 -2
  236. package/src/cli.ts +2 -0
  237. package/src/constants.ts +1 -0
  238. package/src/cpu.test.ts +239 -0
  239. package/src/cpu.ts +173 -0
  240. package/src/index.ts +13 -15
  241. package/src/inference/interruption/defaults.ts +1 -1
  242. package/src/inference/interruption/http_transport.ts +49 -30
  243. package/src/inference/interruption/interruption_detector.ts +22 -6
  244. package/src/inference/interruption/interruption_stream.ts +4 -4
  245. package/src/inference/interruption/types.ts +2 -2
  246. package/src/inference/interruption/ws_transport.ts +63 -59
  247. package/src/inference/llm.ts +3 -1
  248. package/src/inference/stt.test.ts +17 -0
  249. package/src/inference/stt.ts +22 -14
  250. package/src/inference/tts.test.ts +12 -0
  251. package/src/inference/tts.ts +22 -6
  252. package/src/ipc/job_proc_lazy_main.ts +44 -24
  253. package/src/job.ts +1 -1
  254. package/src/language.test.ts +62 -0
  255. package/src/language.ts +380 -0
  256. package/src/llm/index.ts +2 -0
  257. package/src/stream/deferred_stream.ts +5 -1
  258. package/src/stt/stt.ts +2 -1
  259. package/src/utils.ts +20 -0
  260. package/src/voice/agent.test.ts +208 -1
  261. package/src/voice/agent.ts +21 -22
  262. package/src/voice/agent_activity.test.ts +194 -0
  263. package/src/voice/agent_activity.ts +161 -43
  264. package/src/voice/agent_session.ts +103 -92
  265. package/src/voice/audio_recognition.ts +124 -61
  266. package/src/voice/audio_recognition_span.test.ts +115 -35
  267. package/src/voice/events.ts +4 -3
  268. package/src/voice/index.ts +10 -1
  269. package/src/voice/remote_session.ts +1083 -0
  270. package/src/voice/report.test.ts +22 -3
  271. package/src/voice/report.ts +31 -14
  272. package/src/voice/room_io/room_io.ts +52 -2
  273. package/src/voice/turn_config/interruption.ts +1 -1
  274. package/src/voice/turn_config/utils.test.ts +91 -43
  275. package/src/voice/turn_config/utils.ts +120 -56
  276. package/src/worker.ts +34 -50
  277. package/dist/voice/client_events.cjs +0 -554
  278. package/dist/voice/client_events.cjs.map +0 -1
  279. package/dist/voice/client_events.d.cts +0 -195
  280. package/dist/voice/client_events.d.ts +0 -195
  281. package/dist/voice/client_events.d.ts.map +0 -1
  282. package/dist/voice/client_events.js +0 -548
  283. package/dist/voice/client_events.js.map +0 -1
  284. package/dist/voice/wire_format.cjs +0 -798
  285. package/dist/voice/wire_format.cjs.map +0 -1
  286. package/dist/voice/wire_format.d.cts +0 -5503
  287. package/dist/voice/wire_format.d.ts +0 -5503
  288. package/dist/voice/wire_format.d.ts.map +0 -1
  289. package/dist/voice/wire_format.js +0 -728
  290. package/dist/voice/wire_format.js.map +0 -1
  291. package/src/voice/client_events.ts +0 -838
  292. package/src/voice/wire_format.ts +0 -827
@@ -1,12 +1,21 @@
1
1
  import { ParticipantKind } from "@livekit/rtc-node";
2
- import { InMemorySpanExporter, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
2
+ import { ROOT_CONTEXT, context as otelContext, trace } from "@opentelemetry/api";
3
+ import {
4
+ InMemorySpanExporter,
5
+ SimpleSpanProcessor
6
+ } from "@opentelemetry/sdk-trace-base";
3
7
  import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
8
+ import { ReadableStream } from "node:stream/web";
4
9
  import { describe, expect, it, vi } from "vitest";
10
+ import { ChatContext } from "../llm/chat_context.js";
5
11
  import { initializeLogger } from "../log.js";
6
12
  import { SpeechEventType } from "../stt/stt.js";
7
- import { setTracerProvider } from "../telemetry/index.js";
13
+ import { setTracerProvider, tracer } from "../telemetry/index.js";
8
14
  import { VAD, VADEventType } from "../vad.js";
9
- import { AudioRecognition } from "./audio_recognition.js";
15
+ import { AgentSession } from "./agent_session.js";
16
+ import {
17
+ AudioRecognition
18
+ } from "./audio_recognition.js";
10
19
  function setupInMemoryTracing() {
11
20
  const exporter = new InMemorySpanExporter();
12
21
  const provider = new NodeTracerProvider();
@@ -18,6 +27,20 @@ function setupInMemoryTracing() {
18
27
  function spanByName(spans, name) {
19
28
  return spans.find((s) => s.name === name);
20
29
  }
30
+ function createFakeSession(rootSpanContext = ROOT_CONTEXT) {
31
+ return {
32
+ _agentState: "listening",
33
+ _roomIO: {
34
+ linkedParticipant: { sid: "p3", identity: "charlie", kind: ParticipantKind.AGENT }
35
+ },
36
+ _setUserAwayTimer: vi.fn(),
37
+ _cancelUserAwayTimer: vi.fn(),
38
+ _userSpeakingSpan: void 0,
39
+ _userState: "listening",
40
+ emit: vi.fn(),
41
+ rootSpanContext
42
+ };
43
+ }
21
44
  class FakeVADStream extends Object {
22
45
  // We intentionally avoid extending the real VADStream (it is not exported as a value in JS output
23
46
  // in some bundling contexts). Instead we emulate the async iterator shape used by AudioRecognition.
@@ -56,6 +79,8 @@ class FakeVAD extends VAD {
56
79
  }
57
80
  }
58
81
  const alwaysTrueTurnDetector = {
82
+ model: "test-turn-detector",
83
+ provider: "test-provider",
59
84
  supportsLanguage: async () => true,
60
85
  unlikelyThreshold: async () => void 0,
61
86
  predictEndOfTurn: async () => 1
@@ -65,22 +90,14 @@ describe("AudioRecognition user_turn span parity", () => {
65
90
  it("creates user_turn and parents eou_detection under it (stt mode)", async () => {
66
91
  const { exporter } = setupInMemoryTracing();
67
92
  const hooks = {
93
+ onInterruption: vi.fn(),
68
94
  onStartOfSpeech: vi.fn(),
69
95
  onVADInferenceDone: vi.fn(),
70
96
  onEndOfSpeech: vi.fn(),
71
97
  onInterimTranscript: vi.fn(),
72
98
  onFinalTranscript: vi.fn(),
73
99
  onPreemptiveGeneration: vi.fn(),
74
- retrieveChatCtx: () => ({
75
- copy() {
76
- return this;
77
- },
78
- addMessage() {
79
- },
80
- toJSON() {
81
- return { items: [] };
82
- }
83
- }),
100
+ retrieveChatCtx: () => ChatContext.empty(),
84
101
  onEndOfTurn: vi.fn(async () => true)
85
102
  };
86
103
  const sttEvents = [
@@ -125,6 +142,9 @@ describe("AudioRecognition user_turn span parity", () => {
125
142
  const eou = spanByName(spans, "eou_detection");
126
143
  expect(userTurn, "user_turn span missing").toBeTruthy();
127
144
  expect(eou, "eou_detection span missing").toBeTruthy();
145
+ if (!userTurn || !eou) {
146
+ throw new Error("expected user_turn and eou_detection spans");
147
+ }
128
148
  expect(eou.parentSpanId).toBe(userTurn.spanContext().spanId);
129
149
  expect(userTurn.attributes["lk.participant_id"]).toBe("p1");
130
150
  expect(userTurn.attributes["lk.participant_identity"]).toBe("bob");
@@ -137,22 +157,14 @@ describe("AudioRecognition user_turn span parity", () => {
137
157
  it("creates user_turn from VAD startTime (vad mode) and keeps same parenting", async () => {
138
158
  const { exporter } = setupInMemoryTracing();
139
159
  const hooks = {
160
+ onInterruption: vi.fn(),
140
161
  onStartOfSpeech: vi.fn(),
141
162
  onVADInferenceDone: vi.fn(),
142
163
  onEndOfSpeech: vi.fn(),
143
164
  onInterimTranscript: vi.fn(),
144
165
  onFinalTranscript: vi.fn(),
145
166
  onPreemptiveGeneration: vi.fn(),
146
- retrieveChatCtx: () => ({
147
- copy() {
148
- return this;
149
- },
150
- addMessage() {
151
- },
152
- toJSON() {
153
- return { items: [] };
154
- }
155
- }),
167
+ retrieveChatCtx: () => ChatContext.empty(),
156
168
  onEndOfTurn: vi.fn(async () => true)
157
169
  };
158
170
  const now = Date.now();
@@ -224,9 +236,64 @@ describe("AudioRecognition user_turn span parity", () => {
224
236
  const eou = spanByName(spans, "eou_detection");
225
237
  expect(userTurn).toBeTruthy();
226
238
  expect(eou).toBeTruthy();
239
+ if (!userTurn || !eou) {
240
+ throw new Error("expected user_turn and eou_detection spans");
241
+ }
227
242
  expect(eou.parentSpanId).toBe(userTurn.spanContext().spanId);
228
243
  expect(hooks.onStartOfSpeech).toHaveBeenCalled();
229
244
  expect(hooks.onEndOfSpeech).toHaveBeenCalled();
230
245
  });
246
+ it("parents user_speaking under user_turn when an explicit speech context is provided", () => {
247
+ const { exporter } = setupInMemoryTracing();
248
+ const sessionSpan = tracer.startSpan({ name: "agent_session", context: ROOT_CONTEXT });
249
+ const sessionContext = trace.setSpan(ROOT_CONTEXT, sessionSpan);
250
+ const fakeSession = createFakeSession(sessionContext);
251
+ const userTurn = tracer.startSpan({ name: "user_turn", context: sessionContext });
252
+ const userTurnContext = trace.setSpan(sessionContext, userTurn);
253
+ const speakingStartedAt = Date.now() - 100;
254
+ const speakingEndedAt = Date.now();
255
+ otelContext.with(userTurnContext, () => {
256
+ AgentSession.prototype._updateUserState.call(fakeSession, "speaking", {
257
+ lastSpeakingTime: speakingStartedAt,
258
+ otelContext: otelContext.active()
259
+ });
260
+ AgentSession.prototype._updateUserState.call(fakeSession, "listening", {
261
+ lastSpeakingTime: speakingEndedAt,
262
+ otelContext: otelContext.active()
263
+ });
264
+ });
265
+ userTurn.end();
266
+ sessionSpan.end();
267
+ const spans = exporter.getFinishedSpans();
268
+ const userSpeaking = spanByName(spans, "user_speaking");
269
+ const exportedUserTurn = spanByName(spans, "user_turn");
270
+ expect(userSpeaking).toBeTruthy();
271
+ expect(exportedUserTurn).toBeTruthy();
272
+ if (!userSpeaking || !exportedUserTurn) {
273
+ throw new Error("expected user_speaking and user_turn spans");
274
+ }
275
+ expect(userSpeaking.parentSpanId).toBe(exportedUserTurn.spanContext().spanId);
276
+ expect(userSpeaking.attributes["lk.participant_id"]).toBe("p3");
277
+ });
278
+ it("keeps user_speaking attached to the session root without an explicit speech context", () => {
279
+ const { exporter } = setupInMemoryTracing();
280
+ const sessionSpan = tracer.startSpan({ name: "agent_session", context: ROOT_CONTEXT });
281
+ const sessionContext = trace.setSpan(ROOT_CONTEXT, sessionSpan);
282
+ const fakeSession = createFakeSession(sessionContext);
283
+ AgentSession.prototype._updateUserState.call(fakeSession, "speaking", {
284
+ lastSpeakingTime: Date.now() - 100
285
+ });
286
+ AgentSession.prototype._updateUserState.call(fakeSession, "listening", {
287
+ lastSpeakingTime: Date.now()
288
+ });
289
+ sessionSpan.end();
290
+ const spans = exporter.getFinishedSpans();
291
+ const userSpeaking = spanByName(spans, "user_speaking");
292
+ expect(userSpeaking).toBeTruthy();
293
+ if (!userSpeaking) {
294
+ throw new Error("expected user_speaking span");
295
+ }
296
+ expect(userSpeaking.parentSpanId).toBe(sessionSpan.spanContext().spanId);
297
+ });
231
298
  });
232
299
  //# sourceMappingURL=audio_recognition_span.test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/voice/audio_recognition_span.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ParticipantKind } from '@livekit/rtc-node';\nimport { InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { describe, expect, it, vi } from 'vitest';\nimport { initializeLogger } from '../log.js';\nimport { type SpeechEvent, SpeechEventType } from '../stt/stt.js';\nimport { setTracerProvider } from '../telemetry/index.js';\nimport { VAD, type VADEvent, VADEventType, type VADStream } from '../vad.js';\nimport { AudioRecognition, type _TurnDetector } from './audio_recognition.js';\n\nfunction setupInMemoryTracing() {\n const exporter = new InMemorySpanExporter();\n const provider = new NodeTracerProvider();\n provider.addSpanProcessor(new SimpleSpanProcessor(exporter));\n provider.register();\n setTracerProvider(provider);\n return { exporter };\n}\n\nfunction spanByName(spans: any[], name: string) {\n return spans.find((s) => s.name === name);\n}\n\nclass FakeVADStream extends (Object as unknown as { new (): VADStream }) {\n // We intentionally avoid extending the real VADStream (it is not exported as a value in JS output\n // in some bundling contexts). Instead we emulate the async iterator shape used by AudioRecognition.\n private events: VADEvent[];\n private idx = 0;\n constructor(events: VADEvent[]) {\n super();\n this.events = events;\n }\n updateInputStream() {}\n detachInputStream() {}\n close() {}\n [Symbol.asyncIterator]() {\n return this;\n }\n async next(): Promise<IteratorResult<VADEvent>> {\n if (this.idx >= this.events.length) {\n return { done: true, value: undefined };\n }\n const value = this.events[this.idx++]!;\n return { done: false, value };\n }\n}\n\nclass FakeVAD extends VAD {\n label = 'fake-vad';\n private events: VADEvent[];\n constructor(events: VADEvent[]) {\n super({ updateInterval: 1 });\n this.events = events;\n }\n stream(): any {\n return new FakeVADStream(this.events);\n }\n}\n\nconst alwaysTrueTurnDetector: _TurnDetector = {\n supportsLanguage: async () => true,\n unlikelyThreshold: async () => undefined,\n predictEndOfTurn: async () => 1.0,\n};\n\ndescribe('AudioRecognition user_turn span parity', () => {\n initializeLogger({ pretty: false, level: 'silent' });\n\n it('creates user_turn and parents eou_detection under it (stt mode)', async () => {\n const { exporter } = setupInMemoryTracing();\n\n const hooks = {\n onStartOfSpeech: vi.fn(),\n onVADInferenceDone: vi.fn(),\n onEndOfSpeech: vi.fn(),\n onInterimTranscript: vi.fn(),\n onFinalTranscript: vi.fn(),\n onPreemptiveGeneration: vi.fn(),\n retrieveChatCtx: () =>\n ({\n copy() {\n return this;\n },\n addMessage() {},\n toJSON() {\n return { items: [] };\n },\n }) as any,\n onEndOfTurn: vi.fn(async () => true),\n };\n\n const sttEvents: SpeechEvent[] = [\n { type: SpeechEventType.START_OF_SPEECH },\n {\n type: SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [\n {\n language: 'en',\n text: 'hello',\n startTime: 0,\n endTime: 0,\n confidence: 0.9,\n },\n ],\n },\n { type: SpeechEventType.END_OF_SPEECH },\n ];\n\n const sttNode = async () =>\n new ReadableStream<SpeechEvent>({\n start(controller) {\n for (const ev of sttEvents) controller.enqueue(ev);\n controller.close();\n },\n });\n\n const ar = new AudioRecognition({\n recognitionHooks: hooks as any,\n stt: sttNode as any,\n vad: undefined,\n turnDetector: alwaysTrueTurnDetector,\n turnDetectionMode: 'stt',\n minEndpointingDelay: 0,\n maxEndpointingDelay: 0,\n sttModel: 'deepgram-nova2',\n sttProvider: 'deepgram',\n getLinkedParticipant: () => ({ sid: 'p1', identity: 'bob', kind: ParticipantKind.AGENT }),\n });\n\n await ar.start();\n // allow background task to drain\n await new Promise((r) => setTimeout(r, 20));\n await ar.close();\n\n const spans = exporter.getFinishedSpans();\n const userTurn = spanByName(spans, 'user_turn');\n const eou = spanByName(spans, 'eou_detection');\n expect(userTurn, 'user_turn span missing').toBeTruthy();\n expect(eou, 'eou_detection span missing').toBeTruthy();\n\n expect(eou.parentSpanId).toBe(userTurn.spanContext().spanId);\n\n // creation-time attributes\n expect(userTurn.attributes['lk.participant_id']).toBe('p1');\n expect(userTurn.attributes['lk.participant_identity']).toBe('bob');\n expect(userTurn.attributes['lk.participant_kind']).toBe('AGENT');\n expect(userTurn.attributes['gen_ai.request.model']).toBe('deepgram-nova2');\n expect(userTurn.attributes['gen_ai.provider.name']).toBe('deepgram');\n\n // end-of-turn attributes\n expect(userTurn.attributes['lk.user_transcript']).toContain('hello');\n expect(userTurn.attributes['lk.transcript_confidence']).toBeGreaterThan(0);\n });\n\n it('creates user_turn from VAD startTime (vad mode) and keeps same parenting', async () => {\n const { exporter } = setupInMemoryTracing();\n\n const hooks = {\n onStartOfSpeech: vi.fn(),\n onVADInferenceDone: vi.fn(),\n onEndOfSpeech: vi.fn(),\n onInterimTranscript: vi.fn(),\n onFinalTranscript: vi.fn(),\n onPreemptiveGeneration: vi.fn(),\n retrieveChatCtx: () =>\n ({\n copy() {\n return this;\n },\n addMessage() {},\n toJSON() {\n return { items: [] };\n },\n }) as any,\n onEndOfTurn: vi.fn(async () => true),\n };\n\n const now = Date.now();\n const vadEvents: VADEvent[] = [\n {\n type: VADEventType.START_OF_SPEECH,\n samplesIndex: 0,\n timestamp: now,\n speechDuration: 100,\n silenceDuration: 0,\n frames: [],\n probability: 0,\n inferenceDuration: 0,\n speaking: true,\n rawAccumulatedSilence: 0,\n rawAccumulatedSpeech: 0,\n },\n {\n type: VADEventType.END_OF_SPEECH,\n samplesIndex: 0,\n timestamp: now + 200,\n speechDuration: 100,\n silenceDuration: 100,\n frames: [],\n probability: 0,\n inferenceDuration: 0,\n speaking: false,\n rawAccumulatedSilence: 0,\n rawAccumulatedSpeech: 0,\n },\n ];\n\n const sttEvents: SpeechEvent[] = [\n {\n type: SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [\n {\n language: 'en',\n text: 'test',\n startTime: 0,\n endTime: 0,\n confidence: 0.8,\n },\n ],\n },\n ];\n\n const sttNode = async () =>\n new ReadableStream<SpeechEvent>({\n start(controller) {\n for (const ev of sttEvents) controller.enqueue(ev);\n controller.close();\n },\n });\n\n const ar = new AudioRecognition({\n recognitionHooks: hooks as any,\n stt: sttNode as any,\n vad: new FakeVAD(vadEvents) as any,\n turnDetector: alwaysTrueTurnDetector,\n turnDetectionMode: 'vad',\n minEndpointingDelay: 0,\n maxEndpointingDelay: 0,\n sttModel: 'stt-model',\n sttProvider: 'stt-provider',\n getLinkedParticipant: () => ({ sid: 'p2', identity: 'alice', kind: ParticipantKind.AGENT }),\n });\n\n await ar.start();\n await new Promise((r) => setTimeout(r, 20));\n await ar.close();\n\n const spans = exporter.getFinishedSpans();\n const userTurn = spanByName(spans, 'user_turn');\n const eou = spanByName(spans, 'eou_detection');\n expect(userTurn).toBeTruthy();\n expect(eou).toBeTruthy();\n expect(eou.parentSpanId).toBe(userTurn.spanContext().spanId);\n\n expect(hooks.onStartOfSpeech).toHaveBeenCalled();\n expect(hooks.onEndOfSpeech).toHaveBeenCalled();\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/voice/audio_recognition_span.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ParticipantKind } from '@livekit/rtc-node';\nimport { ROOT_CONTEXT, context as otelContext, trace } from '@opentelemetry/api';\nimport {\n InMemorySpanExporter,\n type ReadableSpan,\n SimpleSpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { ReadableStream } from 'node:stream/web';\nimport { describe, expect, it, vi } from 'vitest';\nimport { ChatContext } from '../llm/chat_context.js';\nimport { initializeLogger } from '../log.js';\nimport { type SpeechEvent, SpeechEventType } from '../stt/stt.js';\nimport { setTracerProvider, tracer } from '../telemetry/index.js';\nimport { VAD, type VADEvent, VADEventType, type VADStream } from '../vad.js';\nimport { AgentSession } from './agent_session.js';\nimport {\n AudioRecognition,\n type RecognitionHooks,\n type _TurnDetector,\n} from './audio_recognition.js';\nimport type { STTNode } from './io.js';\n\nfunction setupInMemoryTracing() {\n const exporter = new InMemorySpanExporter();\n const provider = new NodeTracerProvider();\n provider.addSpanProcessor(new SimpleSpanProcessor(exporter));\n provider.register();\n setTracerProvider(provider);\n return { exporter };\n}\n\nfunction spanByName(spans: ReadableSpan[], name: string) {\n return spans.find((s) => s.name === name);\n}\n\nfunction createFakeSession(rootSpanContext = ROOT_CONTEXT): AgentSession {\n return {\n _agentState: 'listening',\n _roomIO: {\n linkedParticipant: { sid: 'p3', identity: 'charlie', kind: ParticipantKind.AGENT },\n },\n _setUserAwayTimer: vi.fn(),\n _cancelUserAwayTimer: vi.fn(),\n _userSpeakingSpan: undefined,\n _userState: 'listening',\n emit: vi.fn(),\n rootSpanContext,\n } as unknown as AgentSession;\n}\n\nclass FakeVADStream extends (Object as unknown as { new (): VADStream }) {\n // We intentionally avoid extending the real VADStream (it is not exported as a value in JS output\n // in some bundling contexts). Instead we emulate the async iterator shape used by AudioRecognition.\n private events: VADEvent[];\n private idx = 0;\n constructor(events: VADEvent[]) {\n super();\n this.events = events;\n }\n updateInputStream() {}\n detachInputStream() {}\n close() {}\n [Symbol.asyncIterator]() {\n return this;\n }\n async next(): Promise<IteratorResult<VADEvent>> {\n if (this.idx >= this.events.length) {\n return { done: true, value: undefined };\n }\n const value = this.events[this.idx++]!;\n return { done: false, value };\n }\n}\n\nclass FakeVAD extends VAD {\n label = 'fake-vad';\n private events: VADEvent[];\n constructor(events: VADEvent[]) {\n super({ updateInterval: 1 });\n this.events = events;\n }\n stream(): any {\n return new FakeVADStream(this.events);\n }\n}\n\nconst alwaysTrueTurnDetector: _TurnDetector = {\n model: 'test-turn-detector',\n provider: 'test-provider',\n supportsLanguage: async () => true,\n unlikelyThreshold: async () => undefined,\n predictEndOfTurn: async () => 1.0,\n};\n\ndescribe('AudioRecognition user_turn span parity', () => {\n initializeLogger({ pretty: false, level: 'silent' });\n\n it('creates user_turn and parents eou_detection under it (stt mode)', async () => {\n const { exporter } = setupInMemoryTracing();\n\n const hooks: RecognitionHooks = {\n onInterruption: vi.fn(),\n onStartOfSpeech: vi.fn(),\n onVADInferenceDone: vi.fn(),\n onEndOfSpeech: vi.fn(),\n onInterimTranscript: vi.fn(),\n onFinalTranscript: vi.fn(),\n onPreemptiveGeneration: vi.fn(),\n retrieveChatCtx: () => ChatContext.empty(),\n onEndOfTurn: vi.fn(async () => true),\n };\n\n const sttEvents: SpeechEvent[] = [\n { type: SpeechEventType.START_OF_SPEECH },\n {\n type: SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [\n {\n language: 'en',\n text: 'hello',\n startTime: 0,\n endTime: 0,\n confidence: 0.9,\n },\n ],\n },\n { type: SpeechEventType.END_OF_SPEECH },\n ];\n\n const sttNode: STTNode = async () =>\n new ReadableStream<SpeechEvent | string>({\n start(controller) {\n for (const ev of sttEvents) controller.enqueue(ev);\n controller.close();\n },\n });\n\n const ar = new AudioRecognition({\n recognitionHooks: hooks,\n stt: sttNode,\n vad: undefined,\n turnDetector: alwaysTrueTurnDetector,\n turnDetectionMode: 'stt',\n minEndpointingDelay: 0,\n maxEndpointingDelay: 0,\n sttModel: 'deepgram-nova2',\n sttProvider: 'deepgram',\n getLinkedParticipant: () => ({ sid: 'p1', identity: 'bob', kind: ParticipantKind.AGENT }),\n });\n\n await ar.start();\n // allow background task to drain\n await new Promise((r) => setTimeout(r, 20));\n await ar.close();\n\n const spans = exporter.getFinishedSpans();\n const userTurn = spanByName(spans, 'user_turn');\n const eou = spanByName(spans, 'eou_detection');\n expect(userTurn, 'user_turn span missing').toBeTruthy();\n expect(eou, 'eou_detection span missing').toBeTruthy();\n if (!userTurn || !eou) {\n throw new Error('expected user_turn and eou_detection spans');\n }\n\n expect(eou.parentSpanId).toBe(userTurn.spanContext().spanId);\n\n // creation-time attributes\n expect(userTurn.attributes['lk.participant_id']).toBe('p1');\n expect(userTurn.attributes['lk.participant_identity']).toBe('bob');\n expect(userTurn.attributes['lk.participant_kind']).toBe('AGENT');\n expect(userTurn.attributes['gen_ai.request.model']).toBe('deepgram-nova2');\n expect(userTurn.attributes['gen_ai.provider.name']).toBe('deepgram');\n\n // end-of-turn attributes\n expect(userTurn.attributes['lk.user_transcript']).toContain('hello');\n expect(userTurn.attributes['lk.transcript_confidence']).toBeGreaterThan(0);\n });\n\n it('creates user_turn from VAD startTime (vad mode) and keeps same parenting', async () => {\n const { exporter } = setupInMemoryTracing();\n\n const hooks: RecognitionHooks = {\n onInterruption: vi.fn(),\n onStartOfSpeech: vi.fn(),\n onVADInferenceDone: vi.fn(),\n onEndOfSpeech: vi.fn(),\n onInterimTranscript: vi.fn(),\n onFinalTranscript: vi.fn(),\n onPreemptiveGeneration: vi.fn(),\n retrieveChatCtx: () => ChatContext.empty(),\n onEndOfTurn: vi.fn(async () => true),\n };\n\n const now = Date.now();\n const vadEvents: VADEvent[] = [\n {\n type: VADEventType.START_OF_SPEECH,\n samplesIndex: 0,\n timestamp: now,\n speechDuration: 100,\n silenceDuration: 0,\n frames: [],\n probability: 0,\n inferenceDuration: 0,\n speaking: true,\n rawAccumulatedSilence: 0,\n rawAccumulatedSpeech: 0,\n },\n {\n type: VADEventType.END_OF_SPEECH,\n samplesIndex: 0,\n timestamp: now + 200,\n speechDuration: 100,\n silenceDuration: 100,\n frames: [],\n probability: 0,\n inferenceDuration: 0,\n speaking: false,\n rawAccumulatedSilence: 0,\n rawAccumulatedSpeech: 0,\n },\n ];\n\n const sttEvents: SpeechEvent[] = [\n {\n type: SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [\n {\n language: 'en',\n text: 'test',\n startTime: 0,\n endTime: 0,\n confidence: 0.8,\n },\n ],\n },\n ];\n\n const sttNode: STTNode = async () =>\n new ReadableStream<SpeechEvent | string>({\n start(controller) {\n for (const ev of sttEvents) controller.enqueue(ev);\n controller.close();\n },\n });\n\n const ar = new AudioRecognition({\n recognitionHooks: hooks,\n stt: sttNode,\n vad: new FakeVAD(vadEvents),\n turnDetector: alwaysTrueTurnDetector,\n turnDetectionMode: 'vad',\n minEndpointingDelay: 0,\n maxEndpointingDelay: 0,\n sttModel: 'stt-model',\n sttProvider: 'stt-provider',\n getLinkedParticipant: () => ({ sid: 'p2', identity: 'alice', kind: ParticipantKind.AGENT }),\n });\n\n await ar.start();\n await new Promise((r) => setTimeout(r, 20));\n await ar.close();\n\n const spans = exporter.getFinishedSpans();\n const userTurn = spanByName(spans, 'user_turn');\n const eou = spanByName(spans, 'eou_detection');\n expect(userTurn).toBeTruthy();\n expect(eou).toBeTruthy();\n if (!userTurn || !eou) {\n throw new Error('expected user_turn and eou_detection spans');\n }\n expect(eou.parentSpanId).toBe(userTurn.spanContext().spanId);\n\n expect(hooks.onStartOfSpeech).toHaveBeenCalled();\n expect(hooks.onEndOfSpeech).toHaveBeenCalled();\n });\n\n it('parents user_speaking under user_turn when an explicit speech context is provided', () => {\n const { exporter } = setupInMemoryTracing();\n const sessionSpan = tracer.startSpan({ name: 'agent_session', context: ROOT_CONTEXT });\n const sessionContext = trace.setSpan(ROOT_CONTEXT, sessionSpan);\n const fakeSession = createFakeSession(sessionContext);\n const userTurn = tracer.startSpan({ name: 'user_turn', context: sessionContext });\n const userTurnContext = trace.setSpan(sessionContext, userTurn);\n const speakingStartedAt = Date.now() - 100;\n const speakingEndedAt = Date.now();\n\n otelContext.with(userTurnContext, () => {\n AgentSession.prototype._updateUserState.call(fakeSession, 'speaking', {\n lastSpeakingTime: speakingStartedAt,\n otelContext: otelContext.active(),\n });\n AgentSession.prototype._updateUserState.call(fakeSession, 'listening', {\n lastSpeakingTime: speakingEndedAt,\n otelContext: otelContext.active(),\n });\n });\n\n userTurn.end();\n sessionSpan.end();\n\n const spans = exporter.getFinishedSpans();\n const userSpeaking = spanByName(spans, 'user_speaking');\n const exportedUserTurn = spanByName(spans, 'user_turn');\n expect(userSpeaking).toBeTruthy();\n expect(exportedUserTurn).toBeTruthy();\n if (!userSpeaking || !exportedUserTurn) {\n throw new Error('expected user_speaking and user_turn spans');\n }\n expect(userSpeaking.parentSpanId).toBe(exportedUserTurn.spanContext().spanId);\n expect(userSpeaking.attributes['lk.participant_id']).toBe('p3');\n });\n\n it('keeps user_speaking attached to the session root without an explicit speech context', () => {\n const { exporter } = setupInMemoryTracing();\n const sessionSpan = tracer.startSpan({ name: 'agent_session', context: ROOT_CONTEXT });\n const sessionContext = trace.setSpan(ROOT_CONTEXT, sessionSpan);\n const fakeSession = createFakeSession(sessionContext);\n\n AgentSession.prototype._updateUserState.call(fakeSession, 'speaking', {\n lastSpeakingTime: Date.now() - 100,\n });\n AgentSession.prototype._updateUserState.call(fakeSession, 'listening', {\n lastSpeakingTime: Date.now(),\n });\n\n sessionSpan.end();\n\n const spans = exporter.getFinishedSpans();\n const userSpeaking = spanByName(spans, 'user_speaking');\n expect(userSpeaking).toBeTruthy();\n if (!userSpeaking) {\n throw new Error('expected user_speaking span');\n }\n expect(userSpeaking.parentSpanId).toBe(sessionSpan.spanContext().spanId);\n });\n});\n"],"mappings":"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","names":[]}
@@ -40,7 +40,7 @@ var AgentSessionEventTypes = /* @__PURE__ */ ((AgentSessionEventTypes2) => {
40
40
  AgentSessionEventTypes2["FunctionToolsExecuted"] = "function_tools_executed";
41
41
  AgentSessionEventTypes2["MetricsCollected"] = "metrics_collected";
42
42
  AgentSessionEventTypes2["SpeechCreated"] = "speech_created";
43
- AgentSessionEventTypes2["UserOverlappingSpeech"] = "user_overlapping_speech";
43
+ AgentSessionEventTypes2["OverlappingSpeech"] = "overlapping_speech";
44
44
  AgentSessionEventTypes2["Error"] = "error";
45
45
  AgentSessionEventTypes2["Close"] = "close";
46
46
  return AgentSessionEventTypes2;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/voice/events.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { InterruptionDetectionError } from '../inference/interruption/errors.js';\nimport type { OverlappingSpeechEvent } from '../inference/interruption/types.js';\nimport type {\n ChatMessage,\n FunctionCall,\n FunctionCallOutput,\n LLM,\n RealtimeModel,\n RealtimeModelError,\n} from '../llm/index.js';\nimport type { LLMError } from '../llm/llm.js';\nimport type { AgentMetrics } from '../metrics/base.js';\nimport type { STT } from '../stt/index.js';\nimport type { STTError } from '../stt/stt.js';\nimport type { TTS } from '../tts/index.js';\nimport type { TTSError } from '../tts/tts.js';\nimport type { SpeechHandle } from './speech_handle.js';\n\nexport enum AgentSessionEventTypes {\n UserInputTranscribed = 'user_input_transcribed',\n AgentStateChanged = 'agent_state_changed',\n UserStateChanged = 'user_state_changed',\n ConversationItemAdded = 'conversation_item_added',\n FunctionToolsExecuted = 'function_tools_executed',\n MetricsCollected = 'metrics_collected',\n SpeechCreated = 'speech_created',\n UserOverlappingSpeech = 'user_overlapping_speech',\n Error = 'error',\n Close = 'close',\n}\n\nexport type UserState = 'speaking' | 'listening' | 'away';\nexport type AgentState = 'initializing' | 'idle' | 'listening' | 'thinking' | 'speaking';\n\nexport enum CloseReason {\n ERROR = 'error',\n JOB_SHUTDOWN = 'job_shutdown',\n PARTICIPANT_DISCONNECTED = 'participant_disconnected',\n USER_INITIATED = 'user_initiated',\n}\n\nexport type ShutdownReason = CloseReason | string;\n\nexport type SpeechSource = 'say' | 'generate_reply' | 'tool_response';\n\nexport type UserStateChangedEvent = {\n type: 'user_state_changed';\n oldState: UserState;\n newState: UserState;\n createdAt: number;\n};\n\nexport const createUserStateChangedEvent = (\n oldState: UserState,\n newState: UserState,\n createdAt: number = Date.now(),\n): UserStateChangedEvent => ({\n type: 'user_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type AgentStateChangedEvent = {\n type: 'agent_state_changed';\n oldState: AgentState;\n newState: AgentState;\n createdAt: number;\n};\n\nexport const createAgentStateChangedEvent = (\n oldState: AgentState,\n newState: AgentState,\n createdAt: number = Date.now(),\n): AgentStateChangedEvent => ({\n type: 'agent_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type UserInputTranscribedEvent = {\n type: 'user_input_transcribed';\n transcript: string;\n isFinal: boolean;\n // TODO(AJS-106): add multi participant support\n /** Not supported yet. Always null by default. */\n speakerId: string | null;\n createdAt: number;\n language: string | null;\n};\n\nexport const createUserInputTranscribedEvent = ({\n transcript,\n isFinal,\n speakerId = null,\n language = null,\n createdAt = Date.now(),\n}: {\n transcript: string;\n isFinal: boolean;\n speakerId?: string | null;\n language?: string | null;\n createdAt?: number;\n}): UserInputTranscribedEvent => ({\n type: 'user_input_transcribed',\n transcript,\n isFinal,\n speakerId,\n language,\n createdAt,\n});\n\nexport type MetricsCollectedEvent = {\n type: 'metrics_collected';\n metrics: AgentMetrics;\n createdAt: number;\n};\n\nexport const createMetricsCollectedEvent = ({\n metrics,\n createdAt = Date.now(),\n}: {\n metrics: AgentMetrics;\n createdAt?: number;\n}): MetricsCollectedEvent => ({\n type: 'metrics_collected',\n metrics,\n createdAt,\n});\n\nexport type ConversationItemAddedEvent = {\n type: 'conversation_item_added';\n item: ChatMessage;\n createdAt: number;\n};\n\nexport const createConversationItemAddedEvent = (\n item: ChatMessage,\n createdAt: number = Date.now(),\n): ConversationItemAddedEvent => ({\n type: 'conversation_item_added',\n item,\n createdAt,\n});\n\nexport type FunctionToolsExecutedEvent = {\n type: 'function_tools_executed';\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt: number;\n};\n\nexport const createFunctionToolsExecutedEvent = ({\n functionCalls,\n functionCallOutputs,\n createdAt = Date.now(),\n}: {\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt?: number;\n}): FunctionToolsExecutedEvent => {\n return {\n type: 'function_tools_executed',\n functionCalls,\n functionCallOutputs,\n createdAt,\n };\n};\n\nexport const zipFunctionCallsAndOutputs = (\n event: FunctionToolsExecutedEvent,\n): Array<[FunctionCall, FunctionCallOutput]> => {\n return event.functionCalls.map((call, index) => [call, event.functionCallOutputs[index]!]);\n};\n\nexport type SpeechCreatedEvent = {\n type: 'speech_created';\n /**\n * True if the speech was created using public methods like `say` or `generate_reply`\n */\n userInitiated: boolean;\n /**\n * Source indicating how the speech handle was created\n */\n source: SpeechSource;\n /**\n * The speech handle that was created\n */\n // TODO(shubhra): we need to make sure this doesn't get serialized\n speechHandle: SpeechHandle;\n /**\n * The timestamp when the speech handle was created\n */\n createdAt: number;\n};\n\nexport const createSpeechCreatedEvent = ({\n userInitiated,\n source,\n speechHandle,\n createdAt = Date.now(),\n}: {\n userInitiated: boolean;\n source: SpeechSource;\n speechHandle: SpeechHandle;\n createdAt?: number;\n}): SpeechCreatedEvent => ({\n type: 'speech_created',\n userInitiated,\n source,\n speechHandle,\n createdAt,\n});\n\nexport type ErrorEvent = {\n type: 'error';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown;\n source: LLM | STT | TTS | RealtimeModel | unknown;\n createdAt: number;\n};\n\nexport const createErrorEvent = (\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown,\n source: LLM | STT | TTS | RealtimeModel | unknown,\n createdAt: number = Date.now(),\n): ErrorEvent => ({\n type: 'error',\n error,\n source,\n createdAt,\n});\n\nexport type CloseEvent = {\n type: 'close';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | null;\n reason: ShutdownReason;\n createdAt: number;\n};\n\nexport const createCloseEvent = (\n reason: ShutdownReason,\n error:\n | RealtimeModelError\n | STTError\n | TTSError\n | LLMError\n | InterruptionDetectionError\n | null = null,\n createdAt: number = Date.now(),\n): CloseEvent => ({\n type: 'close',\n error,\n reason,\n createdAt,\n});\n\nexport type AgentEvent =\n | UserInputTranscribedEvent\n | UserStateChangedEvent\n | AgentStateChangedEvent\n | MetricsCollectedEvent\n | ConversationItemAddedEvent\n | FunctionToolsExecutedEvent\n | SpeechCreatedEvent\n | OverlappingSpeechEvent\n | ErrorEvent\n | CloseEvent;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO,IAAK,yBAAL,kBAAKA,4BAAL;AACL,EAAAA,wBAAA,0BAAuB;AACvB,EAAAA,wBAAA,uBAAoB;AACpB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,mBAAgB;AAChB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,WAAQ;AAVE,SAAAA;AAAA,GAAA;AAgBL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,kBAAe;AACf,EAAAA,aAAA,8BAA2B;AAC3B,EAAAA,aAAA,oBAAiB;AAJP,SAAAA;AAAA,GAAA;AAkBL,MAAM,8BAA8B,CACzC,UACA,UACA,YAAoB,KAAK,IAAI,OACF;AAAA,EAC3B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,+BAA+B,CAC1C,UACA,UACA,YAAoB,KAAK,IAAI,OACD;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AAaO,MAAM,kCAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY,KAAK,IAAI;AACvB,OAMkC;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,MAAM,8BAA8B,CAAC;AAAA,EAC1C;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAG8B;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AACF;AAQO,MAAM,mCAAmC,CAC9C,MACA,YAAoB,KAAK,IAAI,OACG;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AACF;AASO,MAAM,mCAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,MAIkC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,6BAA6B,CACxC,UAC8C;AAC9C,SAAO,MAAM,cAAc,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,MAAM,oBAAoB,KAAK,CAAE,CAAC;AAC3F;AAuBO,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAK2B;AAAA,EACzB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,OACA,QACA,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,QACA,QAMW,MACX,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;","names":["AgentSessionEventTypes","CloseReason"]}
1
+ {"version":3,"sources":["../../src/voice/events.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { InterruptionDetectionError } from '../inference/interruption/errors.js';\nimport type { OverlappingSpeechEvent } from '../inference/interruption/types.js';\nimport type { LanguageCode } from '../language.js';\nimport type {\n ChatMessage,\n FunctionCall,\n FunctionCallOutput,\n LLM,\n RealtimeModel,\n RealtimeModelError,\n} from '../llm/index.js';\nimport type { LLMError } from '../llm/llm.js';\nimport type { AgentMetrics } from '../metrics/base.js';\nimport type { STT } from '../stt/index.js';\nimport type { STTError } from '../stt/stt.js';\nimport type { TTS } from '../tts/index.js';\nimport type { TTSError } from '../tts/tts.js';\nimport type { SpeechHandle } from './speech_handle.js';\n\nexport enum AgentSessionEventTypes {\n UserInputTranscribed = 'user_input_transcribed',\n AgentStateChanged = 'agent_state_changed',\n UserStateChanged = 'user_state_changed',\n ConversationItemAdded = 'conversation_item_added',\n FunctionToolsExecuted = 'function_tools_executed',\n MetricsCollected = 'metrics_collected',\n SpeechCreated = 'speech_created',\n OverlappingSpeech = 'overlapping_speech',\n Error = 'error',\n Close = 'close',\n}\n\nexport type UserState = 'speaking' | 'listening' | 'away';\nexport type AgentState = 'initializing' | 'idle' | 'listening' | 'thinking' | 'speaking';\n\nexport enum CloseReason {\n ERROR = 'error',\n JOB_SHUTDOWN = 'job_shutdown',\n PARTICIPANT_DISCONNECTED = 'participant_disconnected',\n USER_INITIATED = 'user_initiated',\n}\n\nexport type ShutdownReason = CloseReason | string;\n\nexport type SpeechSource = 'say' | 'generate_reply' | 'tool_response';\n\nexport type UserStateChangedEvent = {\n type: 'user_state_changed';\n oldState: UserState;\n newState: UserState;\n createdAt: number;\n};\n\nexport const createUserStateChangedEvent = (\n oldState: UserState,\n newState: UserState,\n createdAt: number = Date.now(),\n): UserStateChangedEvent => ({\n type: 'user_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type AgentStateChangedEvent = {\n type: 'agent_state_changed';\n oldState: AgentState;\n newState: AgentState;\n createdAt: number;\n};\n\nexport const createAgentStateChangedEvent = (\n oldState: AgentState,\n newState: AgentState,\n createdAt: number = Date.now(),\n): AgentStateChangedEvent => ({\n type: 'agent_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type UserInputTranscribedEvent = {\n type: 'user_input_transcribed';\n transcript: string;\n isFinal: boolean;\n // TODO(AJS-106): add multi participant support\n /** Not supported yet. Always null by default. */\n speakerId: string | null;\n createdAt: number;\n language: LanguageCode | null;\n};\n\nexport const createUserInputTranscribedEvent = ({\n transcript,\n isFinal,\n speakerId = null,\n language = null,\n createdAt = Date.now(),\n}: {\n transcript: string;\n isFinal: boolean;\n speakerId?: string | null;\n language?: LanguageCode | null;\n createdAt?: number;\n}): UserInputTranscribedEvent => ({\n type: 'user_input_transcribed',\n transcript,\n isFinal,\n speakerId,\n language,\n createdAt,\n});\n\nexport type MetricsCollectedEvent = {\n type: 'metrics_collected';\n metrics: AgentMetrics;\n createdAt: number;\n};\n\nexport const createMetricsCollectedEvent = ({\n metrics,\n createdAt = Date.now(),\n}: {\n metrics: AgentMetrics;\n createdAt?: number;\n}): MetricsCollectedEvent => ({\n type: 'metrics_collected',\n metrics,\n createdAt,\n});\n\nexport type ConversationItemAddedEvent = {\n type: 'conversation_item_added';\n item: ChatMessage;\n createdAt: number;\n};\n\nexport const createConversationItemAddedEvent = (\n item: ChatMessage,\n createdAt: number = Date.now(),\n): ConversationItemAddedEvent => ({\n type: 'conversation_item_added',\n item,\n createdAt,\n});\n\nexport type FunctionToolsExecutedEvent = {\n type: 'function_tools_executed';\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt: number;\n};\n\nexport const createFunctionToolsExecutedEvent = ({\n functionCalls,\n functionCallOutputs,\n createdAt = Date.now(),\n}: {\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt?: number;\n}): FunctionToolsExecutedEvent => {\n return {\n type: 'function_tools_executed',\n functionCalls,\n functionCallOutputs,\n createdAt,\n };\n};\n\nexport const zipFunctionCallsAndOutputs = (\n event: FunctionToolsExecutedEvent,\n): Array<[FunctionCall, FunctionCallOutput]> => {\n return event.functionCalls.map((call, index) => [call, event.functionCallOutputs[index]!]);\n};\n\nexport type SpeechCreatedEvent = {\n type: 'speech_created';\n /**\n * True if the speech was created using public methods like `say` or `generate_reply`\n */\n userInitiated: boolean;\n /**\n * Source indicating how the speech handle was created\n */\n source: SpeechSource;\n /**\n * The speech handle that was created\n */\n // TODO(shubhra): we need to make sure this doesn't get serialized\n speechHandle: SpeechHandle;\n /**\n * The timestamp when the speech handle was created\n */\n createdAt: number;\n};\n\nexport const createSpeechCreatedEvent = ({\n userInitiated,\n source,\n speechHandle,\n createdAt = Date.now(),\n}: {\n userInitiated: boolean;\n source: SpeechSource;\n speechHandle: SpeechHandle;\n createdAt?: number;\n}): SpeechCreatedEvent => ({\n type: 'speech_created',\n userInitiated,\n source,\n speechHandle,\n createdAt,\n});\n\nexport type ErrorEvent = {\n type: 'error';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown;\n source: LLM | STT | TTS | RealtimeModel | unknown;\n createdAt: number;\n};\n\nexport const createErrorEvent = (\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown,\n source: LLM | STT | TTS | RealtimeModel | unknown,\n createdAt: number = Date.now(),\n): ErrorEvent => ({\n type: 'error',\n error,\n source,\n createdAt,\n});\n\nexport type CloseEvent = {\n type: 'close';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | null;\n reason: ShutdownReason;\n createdAt: number;\n};\n\nexport const createCloseEvent = (\n reason: ShutdownReason,\n error:\n | RealtimeModelError\n | STTError\n | TTSError\n | LLMError\n | InterruptionDetectionError\n | null = null,\n createdAt: number = Date.now(),\n): CloseEvent => ({\n type: 'close',\n error,\n reason,\n createdAt,\n});\n\nexport type AgentEvent =\n | UserInputTranscribedEvent\n | UserStateChangedEvent\n | AgentStateChangedEvent\n | MetricsCollectedEvent\n | ConversationItemAddedEvent\n | FunctionToolsExecutedEvent\n | SpeechCreatedEvent\n | OverlappingSpeechEvent\n | ErrorEvent\n | CloseEvent;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBO,IAAK,yBAAL,kBAAKA,4BAAL;AACL,EAAAA,wBAAA,0BAAuB;AACvB,EAAAA,wBAAA,uBAAoB;AACpB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,mBAAgB;AAChB,EAAAA,wBAAA,uBAAoB;AACpB,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,WAAQ;AAVE,SAAAA;AAAA,GAAA;AAgBL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,kBAAe;AACf,EAAAA,aAAA,8BAA2B;AAC3B,EAAAA,aAAA,oBAAiB;AAJP,SAAAA;AAAA,GAAA;AAkBL,MAAM,8BAA8B,CACzC,UACA,UACA,YAAoB,KAAK,IAAI,OACF;AAAA,EAC3B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,+BAA+B,CAC1C,UACA,UACA,YAAoB,KAAK,IAAI,OACD;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AAaO,MAAM,kCAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY,KAAK,IAAI;AACvB,OAMkC;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,MAAM,8BAA8B,CAAC;AAAA,EAC1C;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAG8B;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AACF;AAQO,MAAM,mCAAmC,CAC9C,MACA,YAAoB,KAAK,IAAI,OACG;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AACF;AASO,MAAM,mCAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,MAIkC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,6BAA6B,CACxC,UAC8C;AAC9C,SAAO,MAAM,cAAc,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,MAAM,oBAAoB,KAAK,CAAE,CAAC;AAC3F;AAuBO,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAK2B;AAAA,EACzB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,OACA,QACA,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,QACA,QAMW,MACX,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;","names":["AgentSessionEventTypes","CloseReason"]}
@@ -1,5 +1,6 @@
1
1
  import type { InterruptionDetectionError } from '../inference/interruption/errors.js';
2
2
  import type { OverlappingSpeechEvent } from '../inference/interruption/types.js';
3
+ import type { LanguageCode } from '../language.js';
3
4
  import type { ChatMessage, FunctionCall, FunctionCallOutput, LLM, RealtimeModel, RealtimeModelError } from '../llm/index.js';
4
5
  import type { LLMError } from '../llm/llm.js';
5
6
  import type { AgentMetrics } from '../metrics/base.js';
@@ -16,7 +17,7 @@ export declare enum AgentSessionEventTypes {
16
17
  FunctionToolsExecuted = "function_tools_executed",
17
18
  MetricsCollected = "metrics_collected",
18
19
  SpeechCreated = "speech_created",
19
- UserOverlappingSpeech = "user_overlapping_speech",
20
+ OverlappingSpeech = "overlapping_speech",
20
21
  Error = "error",
21
22
  Close = "close"
22
23
  }
@@ -51,13 +52,13 @@ export type UserInputTranscribedEvent = {
51
52
  /** Not supported yet. Always null by default. */
52
53
  speakerId: string | null;
53
54
  createdAt: number;
54
- language: string | null;
55
+ language: LanguageCode | null;
55
56
  };
56
57
  export declare const createUserInputTranscribedEvent: ({ transcript, isFinal, speakerId, language, createdAt, }: {
57
58
  transcript: string;
58
59
  isFinal: boolean;
59
60
  speakerId?: string | null;
60
- language?: string | null;
61
+ language?: LanguageCode | null;
61
62
  createdAt?: number;
62
63
  }) => UserInputTranscribedEvent;
63
64
  export type MetricsCollectedEvent = {
@@ -1,5 +1,6 @@
1
1
  import type { InterruptionDetectionError } from '../inference/interruption/errors.js';
2
2
  import type { OverlappingSpeechEvent } from '../inference/interruption/types.js';
3
+ import type { LanguageCode } from '../language.js';
3
4
  import type { ChatMessage, FunctionCall, FunctionCallOutput, LLM, RealtimeModel, RealtimeModelError } from '../llm/index.js';
4
5
  import type { LLMError } from '../llm/llm.js';
5
6
  import type { AgentMetrics } from '../metrics/base.js';
@@ -16,7 +17,7 @@ export declare enum AgentSessionEventTypes {
16
17
  FunctionToolsExecuted = "function_tools_executed",
17
18
  MetricsCollected = "metrics_collected",
18
19
  SpeechCreated = "speech_created",
19
- UserOverlappingSpeech = "user_overlapping_speech",
20
+ OverlappingSpeech = "overlapping_speech",
20
21
  Error = "error",
21
22
  Close = "close"
22
23
  }
@@ -51,13 +52,13 @@ export type UserInputTranscribedEvent = {
51
52
  /** Not supported yet. Always null by default. */
52
53
  speakerId: string | null;
53
54
  createdAt: number;
54
- language: string | null;
55
+ language: LanguageCode | null;
55
56
  };
56
57
  export declare const createUserInputTranscribedEvent: ({ transcript, isFinal, speakerId, language, createdAt, }: {
57
58
  transcript: string;
58
59
  isFinal: boolean;
59
60
  speakerId?: string | null;
60
- language?: string | null;
61
+ language?: LanguageCode | null;
61
62
  createdAt?: number;
62
63
  }) => UserInputTranscribedEvent;
63
64
  export type MetricsCollectedEvent = {
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/voice/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/voice/events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,GAAG,EACH,aAAa,EACb,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,oBAAY,sBAAsB;IAChC,oBAAoB,2BAA2B;IAC/C,iBAAiB,wBAAwB;IACzC,gBAAgB,uBAAuB;IACvC,qBAAqB,4BAA4B;IACjD,qBAAqB,4BAA4B;IACjD,gBAAgB,sBAAsB;IACtC,aAAa,mBAAmB;IAChC,iBAAiB,uBAAuB;IACxC,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;AAC1D,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzF,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,YAAY,iBAAiB;IAC7B,wBAAwB,6BAA6B;IACrD,cAAc,mBAAmB;CAClC;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEtE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,2BAA2B,aAC5B,SAAS,YACT,SAAS,cACR,MAAM,KAChB,qBAKD,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,4BAA4B,aAC7B,UAAU,YACV,UAAU,cACT,MAAM,KAChB,sBAKD,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,iDAAiD;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,+BAA+B,6DAMzC;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,yBAOF,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,2BAA2B,4BAGrC;IACD,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,qBAIF,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,yBAAyB,CAAC;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,gCAAgC,SACrC,WAAW,cACN,MAAM,KAChB,0BAID,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,yBAAyB,CAAC;IAChC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,gCAAgC,uDAI1C;IACD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,0BAOH,CAAC;AAEF,eAAO,MAAM,0BAA0B,UAC9B,0BAA0B,KAChC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAE1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,gBAAgB,CAAC;IACvB;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IACrB;;OAEG;IAEH,YAAY,EAAE,YAAY,CAAC;IAC3B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,wDAKlC;IACD,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,kBAMF,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,0BAA0B,GAAG,OAAO,CAAC;IAClG,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,aAAa,GAAG,OAAO,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,gBAAgB,UACpB,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,0BAA0B,GAAG,OAAO,UACzF,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,aAAa,GAAG,OAAO,cACtC,MAAM,KAChB,UAKD,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,0BAA0B,GAAG,IAAI,CAAC;IAC/F,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACnB,cAAc,UAElB,kBAAkB,GAClB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,0BAA0B,GAC1B,IAAI,cACG,MAAM,KAChB,UAKD,CAAC;AAEH,MAAM,MAAM,UAAU,GAClB,yBAAyB,GACzB,qBAAqB,GACrB,sBAAsB,GACtB,qBAAqB,GACrB,0BAA0B,GAC1B,0BAA0B,GAC1B,kBAAkB,GAClB,sBAAsB,GACtB,UAAU,GACV,UAAU,CAAC"}
@@ -6,7 +6,7 @@ var AgentSessionEventTypes = /* @__PURE__ */ ((AgentSessionEventTypes2) => {
6
6
  AgentSessionEventTypes2["FunctionToolsExecuted"] = "function_tools_executed";
7
7
  AgentSessionEventTypes2["MetricsCollected"] = "metrics_collected";
8
8
  AgentSessionEventTypes2["SpeechCreated"] = "speech_created";
9
- AgentSessionEventTypes2["UserOverlappingSpeech"] = "user_overlapping_speech";
9
+ AgentSessionEventTypes2["OverlappingSpeech"] = "overlapping_speech";
10
10
  AgentSessionEventTypes2["Error"] = "error";
11
11
  AgentSessionEventTypes2["Close"] = "close";
12
12
  return AgentSessionEventTypes2;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/voice/events.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { InterruptionDetectionError } from '../inference/interruption/errors.js';\nimport type { OverlappingSpeechEvent } from '../inference/interruption/types.js';\nimport type {\n ChatMessage,\n FunctionCall,\n FunctionCallOutput,\n LLM,\n RealtimeModel,\n RealtimeModelError,\n} from '../llm/index.js';\nimport type { LLMError } from '../llm/llm.js';\nimport type { AgentMetrics } from '../metrics/base.js';\nimport type { STT } from '../stt/index.js';\nimport type { STTError } from '../stt/stt.js';\nimport type { TTS } from '../tts/index.js';\nimport type { TTSError } from '../tts/tts.js';\nimport type { SpeechHandle } from './speech_handle.js';\n\nexport enum AgentSessionEventTypes {\n UserInputTranscribed = 'user_input_transcribed',\n AgentStateChanged = 'agent_state_changed',\n UserStateChanged = 'user_state_changed',\n ConversationItemAdded = 'conversation_item_added',\n FunctionToolsExecuted = 'function_tools_executed',\n MetricsCollected = 'metrics_collected',\n SpeechCreated = 'speech_created',\n UserOverlappingSpeech = 'user_overlapping_speech',\n Error = 'error',\n Close = 'close',\n}\n\nexport type UserState = 'speaking' | 'listening' | 'away';\nexport type AgentState = 'initializing' | 'idle' | 'listening' | 'thinking' | 'speaking';\n\nexport enum CloseReason {\n ERROR = 'error',\n JOB_SHUTDOWN = 'job_shutdown',\n PARTICIPANT_DISCONNECTED = 'participant_disconnected',\n USER_INITIATED = 'user_initiated',\n}\n\nexport type ShutdownReason = CloseReason | string;\n\nexport type SpeechSource = 'say' | 'generate_reply' | 'tool_response';\n\nexport type UserStateChangedEvent = {\n type: 'user_state_changed';\n oldState: UserState;\n newState: UserState;\n createdAt: number;\n};\n\nexport const createUserStateChangedEvent = (\n oldState: UserState,\n newState: UserState,\n createdAt: number = Date.now(),\n): UserStateChangedEvent => ({\n type: 'user_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type AgentStateChangedEvent = {\n type: 'agent_state_changed';\n oldState: AgentState;\n newState: AgentState;\n createdAt: number;\n};\n\nexport const createAgentStateChangedEvent = (\n oldState: AgentState,\n newState: AgentState,\n createdAt: number = Date.now(),\n): AgentStateChangedEvent => ({\n type: 'agent_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type UserInputTranscribedEvent = {\n type: 'user_input_transcribed';\n transcript: string;\n isFinal: boolean;\n // TODO(AJS-106): add multi participant support\n /** Not supported yet. Always null by default. */\n speakerId: string | null;\n createdAt: number;\n language: string | null;\n};\n\nexport const createUserInputTranscribedEvent = ({\n transcript,\n isFinal,\n speakerId = null,\n language = null,\n createdAt = Date.now(),\n}: {\n transcript: string;\n isFinal: boolean;\n speakerId?: string | null;\n language?: string | null;\n createdAt?: number;\n}): UserInputTranscribedEvent => ({\n type: 'user_input_transcribed',\n transcript,\n isFinal,\n speakerId,\n language,\n createdAt,\n});\n\nexport type MetricsCollectedEvent = {\n type: 'metrics_collected';\n metrics: AgentMetrics;\n createdAt: number;\n};\n\nexport const createMetricsCollectedEvent = ({\n metrics,\n createdAt = Date.now(),\n}: {\n metrics: AgentMetrics;\n createdAt?: number;\n}): MetricsCollectedEvent => ({\n type: 'metrics_collected',\n metrics,\n createdAt,\n});\n\nexport type ConversationItemAddedEvent = {\n type: 'conversation_item_added';\n item: ChatMessage;\n createdAt: number;\n};\n\nexport const createConversationItemAddedEvent = (\n item: ChatMessage,\n createdAt: number = Date.now(),\n): ConversationItemAddedEvent => ({\n type: 'conversation_item_added',\n item,\n createdAt,\n});\n\nexport type FunctionToolsExecutedEvent = {\n type: 'function_tools_executed';\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt: number;\n};\n\nexport const createFunctionToolsExecutedEvent = ({\n functionCalls,\n functionCallOutputs,\n createdAt = Date.now(),\n}: {\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt?: number;\n}): FunctionToolsExecutedEvent => {\n return {\n type: 'function_tools_executed',\n functionCalls,\n functionCallOutputs,\n createdAt,\n };\n};\n\nexport const zipFunctionCallsAndOutputs = (\n event: FunctionToolsExecutedEvent,\n): Array<[FunctionCall, FunctionCallOutput]> => {\n return event.functionCalls.map((call, index) => [call, event.functionCallOutputs[index]!]);\n};\n\nexport type SpeechCreatedEvent = {\n type: 'speech_created';\n /**\n * True if the speech was created using public methods like `say` or `generate_reply`\n */\n userInitiated: boolean;\n /**\n * Source indicating how the speech handle was created\n */\n source: SpeechSource;\n /**\n * The speech handle that was created\n */\n // TODO(shubhra): we need to make sure this doesn't get serialized\n speechHandle: SpeechHandle;\n /**\n * The timestamp when the speech handle was created\n */\n createdAt: number;\n};\n\nexport const createSpeechCreatedEvent = ({\n userInitiated,\n source,\n speechHandle,\n createdAt = Date.now(),\n}: {\n userInitiated: boolean;\n source: SpeechSource;\n speechHandle: SpeechHandle;\n createdAt?: number;\n}): SpeechCreatedEvent => ({\n type: 'speech_created',\n userInitiated,\n source,\n speechHandle,\n createdAt,\n});\n\nexport type ErrorEvent = {\n type: 'error';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown;\n source: LLM | STT | TTS | RealtimeModel | unknown;\n createdAt: number;\n};\n\nexport const createErrorEvent = (\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown,\n source: LLM | STT | TTS | RealtimeModel | unknown,\n createdAt: number = Date.now(),\n): ErrorEvent => ({\n type: 'error',\n error,\n source,\n createdAt,\n});\n\nexport type CloseEvent = {\n type: 'close';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | null;\n reason: ShutdownReason;\n createdAt: number;\n};\n\nexport const createCloseEvent = (\n reason: ShutdownReason,\n error:\n | RealtimeModelError\n | STTError\n | TTSError\n | LLMError\n | InterruptionDetectionError\n | null = null,\n createdAt: number = Date.now(),\n): CloseEvent => ({\n type: 'close',\n error,\n reason,\n createdAt,\n});\n\nexport type AgentEvent =\n | UserInputTranscribedEvent\n | UserStateChangedEvent\n | AgentStateChangedEvent\n | MetricsCollectedEvent\n | ConversationItemAddedEvent\n | FunctionToolsExecutedEvent\n | SpeechCreatedEvent\n | OverlappingSpeechEvent\n | ErrorEvent\n | CloseEvent;\n"],"mappings":"AAqBO,IAAK,yBAAL,kBAAKA,4BAAL;AACL,EAAAA,wBAAA,0BAAuB;AACvB,EAAAA,wBAAA,uBAAoB;AACpB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,mBAAgB;AAChB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,WAAQ;AAVE,SAAAA;AAAA,GAAA;AAgBL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,kBAAe;AACf,EAAAA,aAAA,8BAA2B;AAC3B,EAAAA,aAAA,oBAAiB;AAJP,SAAAA;AAAA,GAAA;AAkBL,MAAM,8BAA8B,CACzC,UACA,UACA,YAAoB,KAAK,IAAI,OACF;AAAA,EAC3B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,+BAA+B,CAC1C,UACA,UACA,YAAoB,KAAK,IAAI,OACD;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AAaO,MAAM,kCAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY,KAAK,IAAI;AACvB,OAMkC;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,MAAM,8BAA8B,CAAC;AAAA,EAC1C;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAG8B;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AACF;AAQO,MAAM,mCAAmC,CAC9C,MACA,YAAoB,KAAK,IAAI,OACG;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AACF;AASO,MAAM,mCAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,MAIkC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,6BAA6B,CACxC,UAC8C;AAC9C,SAAO,MAAM,cAAc,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,MAAM,oBAAoB,KAAK,CAAE,CAAC;AAC3F;AAuBO,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAK2B;AAAA,EACzB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,OACA,QACA,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,QACA,QAMW,MACX,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;","names":["AgentSessionEventTypes","CloseReason"]}
1
+ {"version":3,"sources":["../../src/voice/events.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { InterruptionDetectionError } from '../inference/interruption/errors.js';\nimport type { OverlappingSpeechEvent } from '../inference/interruption/types.js';\nimport type { LanguageCode } from '../language.js';\nimport type {\n ChatMessage,\n FunctionCall,\n FunctionCallOutput,\n LLM,\n RealtimeModel,\n RealtimeModelError,\n} from '../llm/index.js';\nimport type { LLMError } from '../llm/llm.js';\nimport type { AgentMetrics } from '../metrics/base.js';\nimport type { STT } from '../stt/index.js';\nimport type { STTError } from '../stt/stt.js';\nimport type { TTS } from '../tts/index.js';\nimport type { TTSError } from '../tts/tts.js';\nimport type { SpeechHandle } from './speech_handle.js';\n\nexport enum AgentSessionEventTypes {\n UserInputTranscribed = 'user_input_transcribed',\n AgentStateChanged = 'agent_state_changed',\n UserStateChanged = 'user_state_changed',\n ConversationItemAdded = 'conversation_item_added',\n FunctionToolsExecuted = 'function_tools_executed',\n MetricsCollected = 'metrics_collected',\n SpeechCreated = 'speech_created',\n OverlappingSpeech = 'overlapping_speech',\n Error = 'error',\n Close = 'close',\n}\n\nexport type UserState = 'speaking' | 'listening' | 'away';\nexport type AgentState = 'initializing' | 'idle' | 'listening' | 'thinking' | 'speaking';\n\nexport enum CloseReason {\n ERROR = 'error',\n JOB_SHUTDOWN = 'job_shutdown',\n PARTICIPANT_DISCONNECTED = 'participant_disconnected',\n USER_INITIATED = 'user_initiated',\n}\n\nexport type ShutdownReason = CloseReason | string;\n\nexport type SpeechSource = 'say' | 'generate_reply' | 'tool_response';\n\nexport type UserStateChangedEvent = {\n type: 'user_state_changed';\n oldState: UserState;\n newState: UserState;\n createdAt: number;\n};\n\nexport const createUserStateChangedEvent = (\n oldState: UserState,\n newState: UserState,\n createdAt: number = Date.now(),\n): UserStateChangedEvent => ({\n type: 'user_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type AgentStateChangedEvent = {\n type: 'agent_state_changed';\n oldState: AgentState;\n newState: AgentState;\n createdAt: number;\n};\n\nexport const createAgentStateChangedEvent = (\n oldState: AgentState,\n newState: AgentState,\n createdAt: number = Date.now(),\n): AgentStateChangedEvent => ({\n type: 'agent_state_changed',\n oldState,\n newState,\n createdAt,\n});\n\nexport type UserInputTranscribedEvent = {\n type: 'user_input_transcribed';\n transcript: string;\n isFinal: boolean;\n // TODO(AJS-106): add multi participant support\n /** Not supported yet. Always null by default. */\n speakerId: string | null;\n createdAt: number;\n language: LanguageCode | null;\n};\n\nexport const createUserInputTranscribedEvent = ({\n transcript,\n isFinal,\n speakerId = null,\n language = null,\n createdAt = Date.now(),\n}: {\n transcript: string;\n isFinal: boolean;\n speakerId?: string | null;\n language?: LanguageCode | null;\n createdAt?: number;\n}): UserInputTranscribedEvent => ({\n type: 'user_input_transcribed',\n transcript,\n isFinal,\n speakerId,\n language,\n createdAt,\n});\n\nexport type MetricsCollectedEvent = {\n type: 'metrics_collected';\n metrics: AgentMetrics;\n createdAt: number;\n};\n\nexport const createMetricsCollectedEvent = ({\n metrics,\n createdAt = Date.now(),\n}: {\n metrics: AgentMetrics;\n createdAt?: number;\n}): MetricsCollectedEvent => ({\n type: 'metrics_collected',\n metrics,\n createdAt,\n});\n\nexport type ConversationItemAddedEvent = {\n type: 'conversation_item_added';\n item: ChatMessage;\n createdAt: number;\n};\n\nexport const createConversationItemAddedEvent = (\n item: ChatMessage,\n createdAt: number = Date.now(),\n): ConversationItemAddedEvent => ({\n type: 'conversation_item_added',\n item,\n createdAt,\n});\n\nexport type FunctionToolsExecutedEvent = {\n type: 'function_tools_executed';\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt: number;\n};\n\nexport const createFunctionToolsExecutedEvent = ({\n functionCalls,\n functionCallOutputs,\n createdAt = Date.now(),\n}: {\n functionCalls: FunctionCall[];\n functionCallOutputs: FunctionCallOutput[];\n createdAt?: number;\n}): FunctionToolsExecutedEvent => {\n return {\n type: 'function_tools_executed',\n functionCalls,\n functionCallOutputs,\n createdAt,\n };\n};\n\nexport const zipFunctionCallsAndOutputs = (\n event: FunctionToolsExecutedEvent,\n): Array<[FunctionCall, FunctionCallOutput]> => {\n return event.functionCalls.map((call, index) => [call, event.functionCallOutputs[index]!]);\n};\n\nexport type SpeechCreatedEvent = {\n type: 'speech_created';\n /**\n * True if the speech was created using public methods like `say` or `generate_reply`\n */\n userInitiated: boolean;\n /**\n * Source indicating how the speech handle was created\n */\n source: SpeechSource;\n /**\n * The speech handle that was created\n */\n // TODO(shubhra): we need to make sure this doesn't get serialized\n speechHandle: SpeechHandle;\n /**\n * The timestamp when the speech handle was created\n */\n createdAt: number;\n};\n\nexport const createSpeechCreatedEvent = ({\n userInitiated,\n source,\n speechHandle,\n createdAt = Date.now(),\n}: {\n userInitiated: boolean;\n source: SpeechSource;\n speechHandle: SpeechHandle;\n createdAt?: number;\n}): SpeechCreatedEvent => ({\n type: 'speech_created',\n userInitiated,\n source,\n speechHandle,\n createdAt,\n});\n\nexport type ErrorEvent = {\n type: 'error';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown;\n source: LLM | STT | TTS | RealtimeModel | unknown;\n createdAt: number;\n};\n\nexport const createErrorEvent = (\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | unknown,\n source: LLM | STT | TTS | RealtimeModel | unknown,\n createdAt: number = Date.now(),\n): ErrorEvent => ({\n type: 'error',\n error,\n source,\n createdAt,\n});\n\nexport type CloseEvent = {\n type: 'close';\n error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError | null;\n reason: ShutdownReason;\n createdAt: number;\n};\n\nexport const createCloseEvent = (\n reason: ShutdownReason,\n error:\n | RealtimeModelError\n | STTError\n | TTSError\n | LLMError\n | InterruptionDetectionError\n | null = null,\n createdAt: number = Date.now(),\n): CloseEvent => ({\n type: 'close',\n error,\n reason,\n createdAt,\n});\n\nexport type AgentEvent =\n | UserInputTranscribedEvent\n | UserStateChangedEvent\n | AgentStateChangedEvent\n | MetricsCollectedEvent\n | ConversationItemAddedEvent\n | FunctionToolsExecutedEvent\n | SpeechCreatedEvent\n | OverlappingSpeechEvent\n | ErrorEvent\n | CloseEvent;\n"],"mappings":"AAsBO,IAAK,yBAAL,kBAAKA,4BAAL;AACL,EAAAA,wBAAA,0BAAuB;AACvB,EAAAA,wBAAA,uBAAoB;AACpB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,2BAAwB;AACxB,EAAAA,wBAAA,sBAAmB;AACnB,EAAAA,wBAAA,mBAAgB;AAChB,EAAAA,wBAAA,uBAAoB;AACpB,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,WAAQ;AAVE,SAAAA;AAAA,GAAA;AAgBL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,kBAAe;AACf,EAAAA,aAAA,8BAA2B;AAC3B,EAAAA,aAAA,oBAAiB;AAJP,SAAAA;AAAA,GAAA;AAkBL,MAAM,8BAA8B,CACzC,UACA,UACA,YAAoB,KAAK,IAAI,OACF;AAAA,EAC3B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,+BAA+B,CAC1C,UACA,UACA,YAAoB,KAAK,IAAI,OACD;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AAaO,MAAM,kCAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY,KAAK,IAAI;AACvB,OAMkC;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,MAAM,8BAA8B,CAAC;AAAA,EAC1C;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAG8B;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AACF;AAQO,MAAM,mCAAmC,CAC9C,MACA,YAAoB,KAAK,IAAI,OACG;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA;AACF;AASO,MAAM,mCAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,MAIkC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,6BAA6B,CACxC,UAC8C;AAC9C,SAAO,MAAM,cAAc,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,MAAM,oBAAoB,KAAK,CAAE,CAAC;AAC3F;AAuBO,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,KAAK,IAAI;AACvB,OAK2B;AAAA,EACzB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,OACA,QACA,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;AASO,MAAM,mBAAmB,CAC9B,QACA,QAMW,MACX,YAAoB,KAAK,IAAI,OACb;AAAA,EAChB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACF;","names":["AgentSessionEventTypes","CloseReason"]}
@@ -32,7 +32,11 @@ __export(voice_exports, {
32
32
  Agent: () => import_agent.Agent,
33
33
  AgentSession: () => import_agent_session.AgentSession,
34
34
  AgentTask: () => import_agent.AgentTask,
35
+ RemoteSession: () => import_remote_session.RemoteSession,
36
+ RoomSessionTransport: () => import_remote_session.RoomSessionTransport,
35
37
  RunContext: () => import_run_context.RunContext,
38
+ SessionHost: () => import_remote_session.SessionHost,
39
+ SessionTransport: () => import_remote_session.SessionTransport,
36
40
  StopResponse: () => import_agent.StopResponse,
37
41
  testing: () => testing
38
42
  });
@@ -41,7 +45,7 @@ var import_agent = require("./agent.cjs");
41
45
  var import_agent_session = require("./agent_session.cjs");
42
46
  __reExport(voice_exports, require("./avatar/index.cjs"), module.exports);
43
47
  __reExport(voice_exports, require("./background_audio.cjs"), module.exports);
44
- var import_client_events = require("./client_events.cjs");
48
+ var import_remote_session = require("./remote_session.cjs");
45
49
  __reExport(voice_exports, require("./events.cjs"), module.exports);
46
50
  var import_io = require("./io.cjs");
47
51
  __reExport(voice_exports, require("./report.cjs"), module.exports);
@@ -53,7 +57,11 @@ var testing = __toESM(require("./testing/index.cjs"), 1);
53
57
  Agent,
54
58
  AgentSession,
55
59
  AgentTask,
60
+ RemoteSession,
61
+ RoomSessionTransport,
56
62
  RunContext,
63
+ SessionHost,
64
+ SessionTransport,
57
65
  StopResponse,
58
66
  testing,
59
67
  ...require("./avatar/index.cjs"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/voice/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport { Agent, AgentTask, StopResponse, type AgentOptions, type ModelSettings } from './agent.js';\nexport { AgentSession, type AgentSessionOptions, type VoiceOptions } from './agent_session.js';\nexport * from './avatar/index.js';\nexport * from './background_audio.js';\nexport { type TextInputCallback, type TextInputEvent } from './client_events.js';\nexport * from './events.js';\nexport { type TimedString } from './io.js';\nexport * from './report.js';\nexport * from './room_io/index.js';\nexport { RunContext } from './run_context.js';\nexport * as testing from './testing/index.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsF;AACtF,2BAA0E;AAC1E,0BAAc,8BALd;AAMA,0BAAc,kCANd;AAOA,2BAA4D;AAC5D,0BAAc,wBARd;AASA,gBAAiC;AACjC,0BAAc,wBAVd;AAWA,0BAAc,+BAXd;AAYA,yBAA2B;AAC3B,cAAyB;","names":[]}
1
+ {"version":3,"sources":["../../src/voice/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport { Agent, AgentTask, StopResponse, type AgentOptions, type ModelSettings } from './agent.js';\nexport { AgentSession, type AgentSessionOptions, type VoiceOptions } from './agent_session.js';\nexport * from './avatar/index.js';\nexport * from './background_audio.js';\nexport {\n type TextInputCallback,\n type TextInputEvent,\n RemoteSession,\n type RemoteSessionCallbacks,\n type RemoteSessionEventTypes,\n SessionHost,\n SessionTransport,\n RoomSessionTransport,\n} from './remote_session.js';\nexport * from './events.js';\nexport { type TimedString } from './io.js';\nexport * from './report.js';\nexport * from './room_io/index.js';\nexport { RunContext } from './run_context.js';\nexport * as testing from './testing/index.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsF;AACtF,2BAA0E;AAC1E,0BAAc,8BALd;AAMA,0BAAc,kCANd;AAOA,4BASO;AACP,0BAAc,wBAjBd;AAkBA,gBAAiC;AACjC,0BAAc,wBAnBd;AAoBA,0BAAc,+BApBd;AAqBA,yBAA2B;AAC3B,cAAyB;","names":[]}
@@ -2,7 +2,7 @@ export { Agent, AgentTask, StopResponse, type AgentOptions, type ModelSettings }
2
2
  export { AgentSession, type AgentSessionOptions, type VoiceOptions } from './agent_session.js';
3
3
  export * from './avatar/index.js';
4
4
  export * from './background_audio.js';
5
- export { type TextInputCallback, type TextInputEvent } from './client_events.js';
5
+ export { type TextInputCallback, type TextInputEvent, RemoteSession, type RemoteSessionCallbacks, type RemoteSessionEventTypes, SessionHost, SessionTransport, RoomSessionTransport, } from './remote_session.js';
6
6
  export * from './events.js';
7
7
  export { type TimedString } from './io.js';
8
8
  export * from './report.js';
@@ -2,7 +2,7 @@ export { Agent, AgentTask, StopResponse, type AgentOptions, type ModelSettings }
2
2
  export { AgentSession, type AgentSessionOptions, type VoiceOptions } from './agent_session.js';
3
3
  export * from './avatar/index.js';
4
4
  export * from './background_audio.js';
5
- export { type TextInputCallback, type TextInputEvent } from './client_events.js';
5
+ export { type TextInputCallback, type TextInputEvent, RemoteSession, type RemoteSessionCallbacks, type RemoteSessionEventTypes, SessionHost, SessionTransport, RoomSessionTransport, } from './remote_session.js';
6
6
  export * from './events.js';
7
7
  export { type TimedString } from './io.js';
8
8
  export * from './report.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/F,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjF,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/F,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,aAAa,EACb,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,WAAW,EACX,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC"}
@@ -2,7 +2,12 @@ import { Agent, AgentTask, StopResponse } from "./agent.js";
2
2
  import { AgentSession } from "./agent_session.js";
3
3
  export * from "./avatar/index.js";
4
4
  export * from "./background_audio.js";
5
- import {} from "./client_events.js";
5
+ import {
6
+ RemoteSession,
7
+ SessionHost,
8
+ SessionTransport,
9
+ RoomSessionTransport
10
+ } from "./remote_session.js";
6
11
  export * from "./events.js";
7
12
  import {} from "./io.js";
8
13
  export * from "./report.js";
@@ -13,7 +18,11 @@ export {
13
18
  Agent,
14
19
  AgentSession,
15
20
  AgentTask,
21
+ RemoteSession,
22
+ RoomSessionTransport,
16
23
  RunContext,
24
+ SessionHost,
25
+ SessionTransport,
17
26
  StopResponse,
18
27
  testing
19
28
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/voice/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport { Agent, AgentTask, StopResponse, type AgentOptions, type ModelSettings } from './agent.js';\nexport { AgentSession, type AgentSessionOptions, type VoiceOptions } from './agent_session.js';\nexport * from './avatar/index.js';\nexport * from './background_audio.js';\nexport { type TextInputCallback, type TextInputEvent } from './client_events.js';\nexport * from './events.js';\nexport { type TimedString } from './io.js';\nexport * from './report.js';\nexport * from './room_io/index.js';\nexport { RunContext } from './run_context.js';\nexport * as testing from './testing/index.js';\n"],"mappings":"AAGA,SAAS,OAAO,WAAW,oBAA2D;AACtF,SAAS,oBAAiE;AAC1E,cAAc;AACd,cAAc;AACd,eAA4D;AAC5D,cAAc;AACd,eAAiC;AACjC,cAAc;AACd,cAAc;AACd,SAAS,kBAAkB;AAC3B,YAAY,aAAa;","names":[]}
1
+ {"version":3,"sources":["../../src/voice/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport { Agent, AgentTask, StopResponse, type AgentOptions, type ModelSettings } from './agent.js';\nexport { AgentSession, type AgentSessionOptions, type VoiceOptions } from './agent_session.js';\nexport * from './avatar/index.js';\nexport * from './background_audio.js';\nexport {\n type TextInputCallback,\n type TextInputEvent,\n RemoteSession,\n type RemoteSessionCallbacks,\n type RemoteSessionEventTypes,\n SessionHost,\n SessionTransport,\n RoomSessionTransport,\n} from './remote_session.js';\nexport * from './events.js';\nexport { type TimedString } from './io.js';\nexport * from './report.js';\nexport * from './room_io/index.js';\nexport { RunContext } from './run_context.js';\nexport * as testing from './testing/index.js';\n"],"mappings":"AAGA,SAAS,OAAO,WAAW,oBAA2D;AACtF,SAAS,oBAAiE;AAC1E,cAAc;AACd,cAAc;AACd;AAAA,EAGE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,cAAc;AACd,eAAiC;AACjC,cAAc;AACd,cAAc;AACd,SAAS,kBAAkB;AAC3B,YAAY,aAAa;","names":[]}