@livekit/agents 1.0.31 → 1.0.32

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 (98) hide show
  1. package/dist/ipc/inference_proc_executor.cjs +6 -3
  2. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  3. package/dist/ipc/inference_proc_executor.d.ts.map +1 -1
  4. package/dist/ipc/inference_proc_executor.js +6 -3
  5. package/dist/ipc/inference_proc_executor.js.map +1 -1
  6. package/dist/ipc/job_proc_executor.cjs +6 -1
  7. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  8. package/dist/ipc/job_proc_executor.d.ts.map +1 -1
  9. package/dist/ipc/job_proc_executor.js +6 -1
  10. package/dist/ipc/job_proc_executor.js.map +1 -1
  11. package/dist/ipc/job_proc_lazy_main.cjs +1 -1
  12. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  13. package/dist/ipc/job_proc_lazy_main.js +1 -1
  14. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  15. package/dist/ipc/supervised_proc.cjs +29 -7
  16. package/dist/ipc/supervised_proc.cjs.map +1 -1
  17. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  18. package/dist/ipc/supervised_proc.js +29 -7
  19. package/dist/ipc/supervised_proc.js.map +1 -1
  20. package/dist/ipc/supervised_proc.test.cjs +145 -0
  21. package/dist/ipc/supervised_proc.test.cjs.map +1 -0
  22. package/dist/ipc/supervised_proc.test.js +122 -0
  23. package/dist/ipc/supervised_proc.test.js.map +1 -0
  24. package/dist/job.cjs +5 -1
  25. package/dist/job.cjs.map +1 -1
  26. package/dist/job.d.ts.map +1 -1
  27. package/dist/job.js +5 -1
  28. package/dist/job.js.map +1 -1
  29. package/dist/llm/chat_context.cjs +19 -2
  30. package/dist/llm/chat_context.cjs.map +1 -1
  31. package/dist/llm/chat_context.d.cts +8 -0
  32. package/dist/llm/chat_context.d.ts +8 -0
  33. package/dist/llm/chat_context.d.ts.map +1 -1
  34. package/dist/llm/chat_context.js +19 -2
  35. package/dist/llm/chat_context.js.map +1 -1
  36. package/dist/llm/provider_format/google.cjs +6 -2
  37. package/dist/llm/provider_format/google.cjs.map +1 -1
  38. package/dist/llm/provider_format/google.d.ts.map +1 -1
  39. package/dist/llm/provider_format/google.js +6 -2
  40. package/dist/llm/provider_format/google.js.map +1 -1
  41. package/dist/llm/realtime.cjs.map +1 -1
  42. package/dist/llm/realtime.d.cts +4 -0
  43. package/dist/llm/realtime.d.ts +4 -0
  44. package/dist/llm/realtime.d.ts.map +1 -1
  45. package/dist/llm/realtime.js.map +1 -1
  46. package/dist/log.cjs +3 -3
  47. package/dist/log.cjs.map +1 -1
  48. package/dist/log.d.cts +5 -0
  49. package/dist/log.d.ts +5 -0
  50. package/dist/log.d.ts.map +1 -1
  51. package/dist/log.js +3 -3
  52. package/dist/log.js.map +1 -1
  53. package/dist/stream/stream_channel.cjs +8 -1
  54. package/dist/stream/stream_channel.cjs.map +1 -1
  55. package/dist/stream/stream_channel.d.cts +1 -0
  56. package/dist/stream/stream_channel.d.ts +1 -0
  57. package/dist/stream/stream_channel.d.ts.map +1 -1
  58. package/dist/stream/stream_channel.js +8 -1
  59. package/dist/stream/stream_channel.js.map +1 -1
  60. package/dist/telemetry/otel_http_exporter.cjs +13 -10
  61. package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
  62. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
  63. package/dist/telemetry/otel_http_exporter.js +13 -10
  64. package/dist/telemetry/otel_http_exporter.js.map +1 -1
  65. package/dist/telemetry/traces.cjs +22 -4
  66. package/dist/telemetry/traces.cjs.map +1 -1
  67. package/dist/telemetry/traces.d.ts.map +1 -1
  68. package/dist/telemetry/traces.js +22 -4
  69. package/dist/telemetry/traces.js.map +1 -1
  70. package/dist/voice/agent_activity.cjs +25 -5
  71. package/dist/voice/agent_activity.cjs.map +1 -1
  72. package/dist/voice/agent_activity.d.cts +1 -0
  73. package/dist/voice/agent_activity.d.ts +1 -0
  74. package/dist/voice/agent_activity.d.ts.map +1 -1
  75. package/dist/voice/agent_activity.js +26 -6
  76. package/dist/voice/agent_activity.js.map +1 -1
  77. package/dist/voice/generation.cjs +3 -1
  78. package/dist/voice/generation.cjs.map +1 -1
  79. package/dist/voice/generation.d.ts.map +1 -1
  80. package/dist/voice/generation.js +3 -1
  81. package/dist/voice/generation.js.map +1 -1
  82. package/package.json +1 -1
  83. package/src/ipc/inference_proc_executor.ts +11 -3
  84. package/src/ipc/job_proc_executor.ts +11 -1
  85. package/src/ipc/job_proc_lazy_main.ts +1 -1
  86. package/src/ipc/supervised_proc.test.ts +153 -0
  87. package/src/ipc/supervised_proc.ts +27 -9
  88. package/src/job.ts +4 -1
  89. package/src/llm/chat_context.ts +28 -2
  90. package/src/llm/provider_format/google.ts +6 -2
  91. package/src/llm/realtime.ts +5 -0
  92. package/src/log.ts +9 -3
  93. package/src/stream/stream_channel.ts +9 -1
  94. package/src/telemetry/otel_http_exporter.ts +14 -10
  95. package/src/telemetry/traces.ts +28 -4
  96. package/src/voice/agent_activity.ts +27 -2
  97. package/src/voice/generation.ts +2 -0
  98. package/src/llm/__snapshots__/utils.test.ts.snap +0 -65
@@ -12,7 +12,7 @@ import { isSameToolChoice, isSameToolContext } from "../llm/tool_context.js";
12
12
  import { log } from "../log.js";
13
13
  import { DeferredReadableStream } from "../stream/deferred_stream.js";
14
14
  import { STT } from "../stt/stt.js";
15
- import { traceTypes, tracer } from "../telemetry/index.js";
15
+ import { recordRealtimeMetrics, traceTypes, tracer } from "../telemetry/index.js";
16
16
  import { splitWords } from "../tokenize/basic/word.js";
17
17
  import { TTS } from "../tts/tts.js";
18
18
  import { Future, Task, cancelAndWait, waitFor } from "../utils.js";
@@ -46,6 +46,8 @@ class AgentActivity {
46
46
  started = false;
47
47
  audioRecognition;
48
48
  realtimeSession;
49
+ realtimeSpans;
50
+ // Maps response_id to OTEL span for metrics recording
49
51
  turnDetectionMode;
50
52
  logger = log();
51
53
  _draining = false;
@@ -134,6 +136,7 @@ class AgentActivity {
134
136
  this.agent._agentActivity = this;
135
137
  if (this.llm instanceof RealtimeModel) {
136
138
  this.realtimeSession = this.llm.session();
139
+ this.realtimeSpans = /* @__PURE__ */ new Map();
137
140
  this.realtimeSession.on("generation_created", (ev) => this.onGenerationCreated(ev));
138
141
  this.realtimeSession.on("input_speech_started", (ev) => this.onInputSpeechStarted(ev));
139
142
  this.realtimeSession.on("input_speech_stopped", (ev) => this.onInputSpeechStopped(ev));
@@ -346,6 +349,13 @@ class AgentActivity {
346
349
  if (speechHandle && (ev.type === "llm_metrics" || ev.type === "tts_metrics")) {
347
350
  ev.speechId = speechHandle.id;
348
351
  }
352
+ if (ev.type === "realtime_model_metrics" && this.realtimeSpans) {
353
+ const span = this.realtimeSpans.get(ev.requestId);
354
+ if (span) {
355
+ recordRealtimeMetrics(span, ev);
356
+ this.realtimeSpans.delete(ev.requestId);
357
+ }
358
+ }
349
359
  this.agentSession.emit(
350
360
  AgentSessionEventTypes.MetricsCollected,
351
361
  createMetricsCollectedEvent({ metrics: ev })
@@ -1259,6 +1269,10 @@ ${instructions}` : instructions,
1259
1269
  if (!(this.llm instanceof RealtimeModel)) {
1260
1270
  throw new Error("llm is not a realtime model");
1261
1271
  }
1272
+ span.setAttribute(traceTypes.ATTR_GEN_AI_REQUEST_MODEL, this.llm.model);
1273
+ if (this.realtimeSpans && ev.responseId) {
1274
+ this.realtimeSpans.set(ev.responseId, span);
1275
+ }
1262
1276
  this.logger.debug(
1263
1277
  { speech_id: speechHandle.id, stepIndex: speechHandle.numSteps },
1264
1278
  "realtime generation started"
@@ -1486,7 +1500,12 @@ ${instructions}` : instructions,
1486
1500
  this.agentSession._updateAgentState("thinking");
1487
1501
  });
1488
1502
  await executeToolsTask.result;
1489
- if (toolOutput.output.length === 0) return;
1503
+ if (toolOutput.output.length === 0) {
1504
+ if (!speechHandle.interrupted) {
1505
+ this.agentSession._updateAgentState("listening");
1506
+ }
1507
+ return;
1508
+ }
1490
1509
  const { maxToolSteps } = this.agentSession.options;
1491
1510
  if (speechHandle.numSteps >= maxToolSteps) {
1492
1511
  this.logger.warn(
@@ -1664,7 +1683,7 @@ ${instructions}` : instructions,
1664
1683
  }
1665
1684
  }
1666
1685
  async close() {
1667
- var _a, _b, _c;
1686
+ var _a, _b, _c, _d;
1668
1687
  const unlock = await this.lock.lock();
1669
1688
  try {
1670
1689
  if (!this._draining) {
@@ -1694,9 +1713,10 @@ ${instructions}` : instructions,
1694
1713
  this.vad.off("metrics_collected", this.onMetricsCollected);
1695
1714
  }
1696
1715
  this.detachAudioInput();
1697
- await ((_a = this.realtimeSession) == null ? void 0 : _a.close());
1698
- await ((_b = this.audioRecognition) == null ? void 0 : _b.close());
1699
- await ((_c = this._mainTask) == null ? void 0 : _c.cancelAndWait());
1716
+ (_a = this.realtimeSpans) == null ? void 0 : _a.clear();
1717
+ await ((_b = this.realtimeSession) == null ? void 0 : _b.close());
1718
+ await ((_c = this.audioRecognition) == null ? void 0 : _c.close());
1719
+ await ((_d = this._mainTask) == null ? void 0 : _d.cancelAndWait());
1700
1720
  } finally {
1701
1721
  unlock();
1702
1722
  }