@livekit/agents 1.0.24 → 1.0.27

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 (184) hide show
  1. package/dist/inference/llm.cjs +1 -2
  2. package/dist/inference/llm.cjs.map +1 -1
  3. package/dist/inference/llm.d.ts.map +1 -1
  4. package/dist/inference/llm.js +1 -2
  5. package/dist/inference/llm.js.map +1 -1
  6. package/dist/inference/stt.cjs +1 -1
  7. package/dist/inference/stt.cjs.map +1 -1
  8. package/dist/inference/stt.d.ts.map +1 -1
  9. package/dist/inference/stt.js +1 -1
  10. package/dist/inference/stt.js.map +1 -1
  11. package/dist/inference/tts.cjs +4 -4
  12. package/dist/inference/tts.cjs.map +1 -1
  13. package/dist/inference/tts.d.cts +0 -1
  14. package/dist/inference/tts.d.ts +0 -1
  15. package/dist/inference/tts.d.ts.map +1 -1
  16. package/dist/inference/tts.js +4 -4
  17. package/dist/inference/tts.js.map +1 -1
  18. package/dist/ipc/job_proc_lazy_main.cjs +1 -1
  19. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  20. package/dist/ipc/job_proc_lazy_main.js +1 -1
  21. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  22. package/dist/job.cjs +29 -2
  23. package/dist/job.cjs.map +1 -1
  24. package/dist/job.d.cts +6 -0
  25. package/dist/job.d.ts +6 -0
  26. package/dist/job.d.ts.map +1 -1
  27. package/dist/job.js +19 -2
  28. package/dist/job.js.map +1 -1
  29. package/dist/llm/llm.cjs +2 -1
  30. package/dist/llm/llm.cjs.map +1 -1
  31. package/dist/llm/llm.d.cts +1 -1
  32. package/dist/llm/llm.d.ts +1 -1
  33. package/dist/llm/llm.d.ts.map +1 -1
  34. package/dist/llm/llm.js +2 -1
  35. package/dist/llm/llm.js.map +1 -1
  36. package/dist/stream/deferred_stream.cjs +12 -4
  37. package/dist/stream/deferred_stream.cjs.map +1 -1
  38. package/dist/stream/deferred_stream.d.cts +6 -1
  39. package/dist/stream/deferred_stream.d.ts +6 -1
  40. package/dist/stream/deferred_stream.d.ts.map +1 -1
  41. package/dist/stream/deferred_stream.js +12 -4
  42. package/dist/stream/deferred_stream.js.map +1 -1
  43. package/dist/stream/deferred_stream.test.cjs +2 -2
  44. package/dist/stream/deferred_stream.test.cjs.map +1 -1
  45. package/dist/stream/deferred_stream.test.js +2 -2
  46. package/dist/stream/deferred_stream.test.js.map +1 -1
  47. package/dist/stt/stream_adapter.cjs +15 -8
  48. package/dist/stt/stream_adapter.cjs.map +1 -1
  49. package/dist/stt/stream_adapter.d.cts +7 -3
  50. package/dist/stt/stream_adapter.d.ts +7 -3
  51. package/dist/stt/stream_adapter.d.ts.map +1 -1
  52. package/dist/stt/stream_adapter.js +15 -8
  53. package/dist/stt/stream_adapter.js.map +1 -1
  54. package/dist/stt/stt.cjs +8 -3
  55. package/dist/stt/stt.cjs.map +1 -1
  56. package/dist/stt/stt.d.cts +9 -3
  57. package/dist/stt/stt.d.ts +9 -3
  58. package/dist/stt/stt.d.ts.map +1 -1
  59. package/dist/stt/stt.js +9 -4
  60. package/dist/stt/stt.js.map +1 -1
  61. package/dist/telemetry/traces.cjs +23 -2
  62. package/dist/telemetry/traces.cjs.map +1 -1
  63. package/dist/telemetry/traces.d.ts.map +1 -1
  64. package/dist/telemetry/traces.js +23 -2
  65. package/dist/telemetry/traces.js.map +1 -1
  66. package/dist/tts/stream_adapter.cjs +10 -7
  67. package/dist/tts/stream_adapter.cjs.map +1 -1
  68. package/dist/tts/stream_adapter.d.cts +6 -3
  69. package/dist/tts/stream_adapter.d.ts +6 -3
  70. package/dist/tts/stream_adapter.d.ts.map +1 -1
  71. package/dist/tts/stream_adapter.js +10 -7
  72. package/dist/tts/stream_adapter.js.map +1 -1
  73. package/dist/tts/tts.cjs +27 -16
  74. package/dist/tts/tts.cjs.map +1 -1
  75. package/dist/tts/tts.d.cts +12 -5
  76. package/dist/tts/tts.d.ts +12 -5
  77. package/dist/tts/tts.d.ts.map +1 -1
  78. package/dist/tts/tts.js +28 -17
  79. package/dist/tts/tts.js.map +1 -1
  80. package/dist/types.cjs +21 -32
  81. package/dist/types.cjs.map +1 -1
  82. package/dist/types.d.cts +41 -10
  83. package/dist/types.d.ts +41 -10
  84. package/dist/types.d.ts.map +1 -1
  85. package/dist/types.js +18 -30
  86. package/dist/types.js.map +1 -1
  87. package/dist/voice/agent.cjs +54 -19
  88. package/dist/voice/agent.cjs.map +1 -1
  89. package/dist/voice/agent.d.ts.map +1 -1
  90. package/dist/voice/agent.js +54 -19
  91. package/dist/voice/agent.js.map +1 -1
  92. package/dist/voice/agent_activity.cjs +0 -3
  93. package/dist/voice/agent_activity.cjs.map +1 -1
  94. package/dist/voice/agent_activity.d.ts.map +1 -1
  95. package/dist/voice/agent_activity.js +0 -3
  96. package/dist/voice/agent_activity.js.map +1 -1
  97. package/dist/voice/agent_session.cjs +107 -27
  98. package/dist/voice/agent_session.cjs.map +1 -1
  99. package/dist/voice/agent_session.d.cts +16 -2
  100. package/dist/voice/agent_session.d.ts +16 -2
  101. package/dist/voice/agent_session.d.ts.map +1 -1
  102. package/dist/voice/agent_session.js +110 -27
  103. package/dist/voice/agent_session.js.map +1 -1
  104. package/dist/voice/events.cjs.map +1 -1
  105. package/dist/voice/events.d.cts +4 -4
  106. package/dist/voice/events.d.ts +4 -4
  107. package/dist/voice/events.d.ts.map +1 -1
  108. package/dist/voice/events.js.map +1 -1
  109. package/dist/voice/generation.cjs +6 -7
  110. package/dist/voice/generation.cjs.map +1 -1
  111. package/dist/voice/generation.d.ts.map +1 -1
  112. package/dist/voice/generation.js +7 -8
  113. package/dist/voice/generation.js.map +1 -1
  114. package/dist/voice/io.cjs +16 -0
  115. package/dist/voice/io.cjs.map +1 -1
  116. package/dist/voice/io.d.cts +8 -0
  117. package/dist/voice/io.d.ts +8 -0
  118. package/dist/voice/io.d.ts.map +1 -1
  119. package/dist/voice/io.js +16 -0
  120. package/dist/voice/io.js.map +1 -1
  121. package/dist/voice/recorder_io/index.cjs +23 -0
  122. package/dist/voice/recorder_io/index.cjs.map +1 -0
  123. package/dist/voice/recorder_io/index.d.cts +2 -0
  124. package/dist/voice/recorder_io/index.d.ts +2 -0
  125. package/dist/voice/recorder_io/index.d.ts.map +1 -0
  126. package/dist/voice/recorder_io/index.js +2 -0
  127. package/dist/voice/recorder_io/index.js.map +1 -0
  128. package/dist/voice/recorder_io/recorder_io.cjs +542 -0
  129. package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
  130. package/dist/voice/recorder_io/recorder_io.d.cts +100 -0
  131. package/dist/voice/recorder_io/recorder_io.d.ts +100 -0
  132. package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
  133. package/dist/voice/recorder_io/recorder_io.js +508 -0
  134. package/dist/voice/recorder_io/recorder_io.js.map +1 -0
  135. package/dist/voice/report.cjs +7 -2
  136. package/dist/voice/report.cjs.map +1 -1
  137. package/dist/voice/report.d.cts +11 -1
  138. package/dist/voice/report.d.ts +11 -1
  139. package/dist/voice/report.d.ts.map +1 -1
  140. package/dist/voice/report.js +7 -2
  141. package/dist/voice/report.js.map +1 -1
  142. package/dist/voice/room_io/_input.cjs +2 -1
  143. package/dist/voice/room_io/_input.cjs.map +1 -1
  144. package/dist/voice/room_io/_input.d.ts.map +1 -1
  145. package/dist/voice/room_io/_input.js +2 -1
  146. package/dist/voice/room_io/_input.js.map +1 -1
  147. package/dist/voice/room_io/_output.cjs +8 -7
  148. package/dist/voice/room_io/_output.cjs.map +1 -1
  149. package/dist/voice/room_io/_output.d.cts +2 -1
  150. package/dist/voice/room_io/_output.d.ts +2 -1
  151. package/dist/voice/room_io/_output.d.ts.map +1 -1
  152. package/dist/voice/room_io/_output.js +8 -7
  153. package/dist/voice/room_io/_output.js.map +1 -1
  154. package/dist/worker.cjs +4 -3
  155. package/dist/worker.cjs.map +1 -1
  156. package/dist/worker.js +4 -3
  157. package/dist/worker.js.map +1 -1
  158. package/package.json +1 -1
  159. package/src/inference/llm.ts +0 -1
  160. package/src/inference/stt.ts +1 -2
  161. package/src/inference/tts.ts +5 -4
  162. package/src/ipc/job_proc_lazy_main.ts +1 -1
  163. package/src/job.ts +21 -2
  164. package/src/llm/llm.ts +2 -2
  165. package/src/stream/deferred_stream.test.ts +3 -3
  166. package/src/stream/deferred_stream.ts +22 -5
  167. package/src/stt/stream_adapter.ts +18 -8
  168. package/src/stt/stt.ts +19 -6
  169. package/src/telemetry/traces.ts +25 -3
  170. package/src/tts/stream_adapter.ts +15 -7
  171. package/src/tts/tts.ts +46 -21
  172. package/src/types.ts +57 -33
  173. package/src/voice/agent.ts +59 -19
  174. package/src/voice/agent_activity.ts +0 -3
  175. package/src/voice/agent_session.ts +142 -35
  176. package/src/voice/events.ts +6 -3
  177. package/src/voice/generation.ts +10 -8
  178. package/src/voice/io.ts +19 -0
  179. package/src/voice/recorder_io/index.ts +4 -0
  180. package/src/voice/recorder_io/recorder_io.ts +690 -0
  181. package/src/voice/report.ts +20 -3
  182. package/src/voice/room_io/_input.ts +2 -1
  183. package/src/voice/room_io/_output.ts +10 -7
  184. package/src/worker.ts +1 -1
@@ -17,6 +17,12 @@ export interface SessionReport {
17
17
  startedAt: number;
18
18
  /** Timestamp when the session report was created (milliseconds), typically at the end of the session */
19
19
  timestamp: number;
20
+ /** Path to the audio recording file (if recording was enabled) */
21
+ audioRecordingPath?: string;
22
+ /** Timestamp when the audio recording started (milliseconds) */
23
+ audioRecordingStartedAt?: number;
24
+ /** Duration of the session in milliseconds */
25
+ duration?: number;
20
26
  }
21
27
 
22
28
  export interface SessionReportOptions {
@@ -26,14 +32,21 @@ export interface SessionReportOptions {
26
32
  options: VoiceOptions;
27
33
  events: AgentEvent[];
28
34
  chatHistory: ChatContext;
29
- enableUserDataTraining?: boolean;
35
+ enableRecording?: boolean;
30
36
  /** Timestamp when the session started (milliseconds) */
31
37
  startedAt?: number;
32
38
  /** Timestamp when the session report was created (milliseconds) */
33
39
  timestamp?: number;
40
+ /** Path to the audio recording file (if recording was enabled) */
41
+ audioRecordingPath?: string;
42
+ /** Timestamp when the audio recording started (milliseconds) */
43
+ audioRecordingStartedAt?: number;
34
44
  }
35
45
 
36
46
  export function createSessionReport(opts: SessionReportOptions): SessionReport {
47
+ const timestamp = opts.timestamp ?? Date.now();
48
+ const audioRecordingStartedAt = opts.audioRecordingStartedAt;
49
+
37
50
  return {
38
51
  jobId: opts.jobId,
39
52
  roomId: opts.roomId,
@@ -41,9 +54,13 @@ export function createSessionReport(opts: SessionReportOptions): SessionReport {
41
54
  options: opts.options,
42
55
  events: opts.events,
43
56
  chatHistory: opts.chatHistory,
44
- enableRecording: opts.enableUserDataTraining ?? false,
57
+ enableRecording: opts.enableRecording ?? false,
45
58
  startedAt: opts.startedAt ?? Date.now(),
46
- timestamp: opts.timestamp ?? Date.now(),
59
+ timestamp,
60
+ audioRecordingPath: opts.audioRecordingPath,
61
+ audioRecordingStartedAt,
62
+ duration:
63
+ audioRecordingStartedAt !== undefined ? timestamp - audioRecordingStartedAt : undefined,
47
64
  };
48
65
  }
49
66
 
@@ -156,6 +156,7 @@ export class ParticipantAudioInputStream extends AudioInput {
156
156
  this.room.off(RoomEvent.TrackSubscribed, this.onTrackSubscribed);
157
157
  this.room.off(RoomEvent.TrackUnpublished, this.onTrackUnpublished);
158
158
  this.closeStream();
159
- this.deferredStream.stream.cancel();
159
+ // Ignore errors - stream may be locked by RecorderIO or already cancelled
160
+ await this.deferredStream.stream.cancel().catch(() => {});
160
161
  }
161
162
  }
@@ -321,7 +321,9 @@ export class ParticipantAudioOutput extends AudioOutput {
321
321
  private audioSource: AudioSource;
322
322
  private publication?: LocalTrackPublication;
323
323
  private flushTask?: Task<void>;
324
- private pushedDurationMs: number = 0;
324
+
325
+ /** Duration of audio pushed to the source, in seconds */
326
+ private pushedDuration: number = 0;
325
327
  private startedFuture: Future<void> = new Future();
326
328
  private interruptedFuture: Future<void> = new Future();
327
329
 
@@ -346,7 +348,7 @@ export class ParticipantAudioOutput extends AudioOutput {
346
348
  super.captureFrame(frame);
347
349
 
348
350
  // TODO(AJS-102): use frame.durationMs once available in rtc-node
349
- this.pushedDurationMs += frame.samplesPerChannel / frame.sampleRate;
351
+ this.pushedDuration += frame.samplesPerChannel / frame.sampleRate;
350
352
  await this.audioSource.captureFrame(frame);
351
353
  }
352
354
 
@@ -369,15 +371,16 @@ export class ParticipantAudioOutput extends AudioOutput {
369
371
  this.interruptedFuture.await.then(() => true),
370
372
  ]);
371
373
 
372
- let pushedDuration = this.pushedDurationMs;
374
+ let pushedDuration = this.pushedDuration;
373
375
 
374
376
  if (interrupted) {
375
377
  // Calculate actual played duration accounting for queued audio
376
- pushedDuration = Math.max(this.pushedDurationMs - this.audioSource.queuedDuration, 0);
378
+ // Note: queuedDuration is in milliseconds, pushedDuration is in seconds
379
+ pushedDuration = Math.max(this.pushedDuration - this.audioSource.queuedDuration / 1000, 0);
377
380
  this.audioSource.clearQueue();
378
381
  }
379
382
 
380
- this.pushedDurationMs = 0;
383
+ this.pushedDuration = 0;
381
384
  this.interruptedFuture = new Future();
382
385
  this.onPlaybackFinished({
383
386
  playbackPosition: pushedDuration,
@@ -391,7 +394,7 @@ export class ParticipantAudioOutput extends AudioOutput {
391
394
  flush(): void {
392
395
  super.flush();
393
396
 
394
- if (!this.pushedDurationMs) {
397
+ if (!this.pushedDuration) {
395
398
  return;
396
399
  }
397
400
 
@@ -404,7 +407,7 @@ export class ParticipantAudioOutput extends AudioOutput {
404
407
  }
405
408
 
406
409
  clearBuffer(): void {
407
- if (!this.pushedDurationMs) {
410
+ if (!this.pushedDuration) {
408
411
  return;
409
412
  }
410
413
 
package/src/worker.ts CHANGED
@@ -729,7 +729,7 @@ export class AgentServer {
729
729
 
730
730
  const req = new JobRequest(msg.job!, onReject, onAccept);
731
731
  this.#logger
732
- .child({ job: msg.job, resuming: msg.resuming, agentName: this.#opts.agentName })
732
+ .child({ jobId: msg.job?.id, resuming: msg.resuming, agentName: this.#opts.agentName })
733
733
  .info('received job request');
734
734
 
735
735
  const jobRequestTask = async () => {