@livekit/agents 0.5.2 → 0.6.1

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 (140) hide show
  1. package/dist/index.cjs +3 -0
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/job.cjs.map +1 -1
  8. package/dist/job.js.map +1 -1
  9. package/dist/llm/index.cjs +2 -0
  10. package/dist/llm/index.cjs.map +1 -1
  11. package/dist/llm/index.d.ts +1 -1
  12. package/dist/llm/index.d.ts.map +1 -1
  13. package/dist/llm/index.js +2 -0
  14. package/dist/llm/index.js.map +1 -1
  15. package/dist/llm/llm.cjs +47 -3
  16. package/dist/llm/llm.cjs.map +1 -1
  17. package/dist/llm/llm.d.ts +15 -2
  18. package/dist/llm/llm.d.ts.map +1 -1
  19. package/dist/llm/llm.js +46 -3
  20. package/dist/llm/llm.js.map +1 -1
  21. package/dist/metrics/base.cjs +44 -0
  22. package/dist/metrics/base.cjs.map +1 -0
  23. package/dist/metrics/base.d.ts +96 -0
  24. package/dist/metrics/base.d.ts.map +1 -0
  25. package/dist/metrics/base.js +20 -0
  26. package/dist/metrics/base.js.map +1 -0
  27. package/dist/metrics/index.cjs +35 -0
  28. package/dist/metrics/index.cjs.map +1 -0
  29. package/dist/metrics/index.d.ts +5 -0
  30. package/dist/metrics/index.d.ts.map +1 -0
  31. package/dist/metrics/index.js +9 -0
  32. package/dist/metrics/index.js.map +1 -0
  33. package/dist/metrics/usage_collector.cjs +53 -0
  34. package/dist/metrics/usage_collector.cjs.map +1 -0
  35. package/dist/metrics/usage_collector.d.ts +14 -0
  36. package/dist/metrics/usage_collector.d.ts.map +1 -0
  37. package/dist/metrics/usage_collector.js +29 -0
  38. package/dist/metrics/usage_collector.js.map +1 -0
  39. package/dist/metrics/utils.cjs +104 -0
  40. package/dist/metrics/utils.cjs.map +1 -0
  41. package/dist/metrics/utils.d.ts +10 -0
  42. package/dist/metrics/utils.d.ts.map +1 -0
  43. package/dist/metrics/utils.js +73 -0
  44. package/dist/metrics/utils.js.map +1 -0
  45. package/dist/multimodal/multimodal_agent.cjs +34 -16
  46. package/dist/multimodal/multimodal_agent.cjs.map +1 -1
  47. package/dist/multimodal/multimodal_agent.d.ts +4 -5
  48. package/dist/multimodal/multimodal_agent.d.ts.map +1 -1
  49. package/dist/multimodal/multimodal_agent.js +34 -16
  50. package/dist/multimodal/multimodal_agent.js.map +1 -1
  51. package/dist/pipeline/index.cjs +2 -0
  52. package/dist/pipeline/index.cjs.map +1 -1
  53. package/dist/pipeline/index.d.ts +1 -1
  54. package/dist/pipeline/index.d.ts.map +1 -1
  55. package/dist/pipeline/index.js +3 -1
  56. package/dist/pipeline/index.js.map +1 -1
  57. package/dist/pipeline/pipeline_agent.cjs +166 -66
  58. package/dist/pipeline/pipeline_agent.cjs.map +1 -1
  59. package/dist/pipeline/pipeline_agent.d.ts +10 -4
  60. package/dist/pipeline/pipeline_agent.d.ts.map +1 -1
  61. package/dist/pipeline/pipeline_agent.js +169 -69
  62. package/dist/pipeline/pipeline_agent.js.map +1 -1
  63. package/dist/pipeline/speech_handle.cjs +49 -1
  64. package/dist/pipeline/speech_handle.cjs.map +1 -1
  65. package/dist/pipeline/speech_handle.d.ts +12 -2
  66. package/dist/pipeline/speech_handle.d.ts.map +1 -1
  67. package/dist/pipeline/speech_handle.js +50 -2
  68. package/dist/pipeline/speech_handle.js.map +1 -1
  69. package/dist/stt/index.cjs.map +1 -1
  70. package/dist/stt/index.d.ts +1 -1
  71. package/dist/stt/index.d.ts.map +1 -1
  72. package/dist/stt/index.js.map +1 -1
  73. package/dist/stt/stream_adapter.cjs +15 -5
  74. package/dist/stt/stream_adapter.cjs.map +1 -1
  75. package/dist/stt/stream_adapter.d.ts +4 -1
  76. package/dist/stt/stream_adapter.d.ts.map +1 -1
  77. package/dist/stt/stream_adapter.js +15 -5
  78. package/dist/stt/stream_adapter.js.map +1 -1
  79. package/dist/stt/stt.cjs +46 -2
  80. package/dist/stt/stt.cjs.map +1 -1
  81. package/dist/stt/stt.d.ts +25 -3
  82. package/dist/stt/stt.d.ts.map +1 -1
  83. package/dist/stt/stt.js +46 -2
  84. package/dist/stt/stt.js.map +1 -1
  85. package/dist/tts/index.cjs +4 -2
  86. package/dist/tts/index.cjs.map +1 -1
  87. package/dist/tts/index.d.ts +1 -1
  88. package/dist/tts/index.d.ts.map +1 -1
  89. package/dist/tts/index.js +3 -1
  90. package/dist/tts/index.js.map +1 -1
  91. package/dist/tts/stream_adapter.cjs +14 -3
  92. package/dist/tts/stream_adapter.cjs.map +1 -1
  93. package/dist/tts/stream_adapter.d.ts +3 -0
  94. package/dist/tts/stream_adapter.d.ts.map +1 -1
  95. package/dist/tts/stream_adapter.js +15 -4
  96. package/dist/tts/stream_adapter.js.map +1 -1
  97. package/dist/tts/tts.cjs +109 -6
  98. package/dist/tts/tts.cjs.map +1 -1
  99. package/dist/tts/tts.d.ts +24 -1
  100. package/dist/tts/tts.d.ts.map +1 -1
  101. package/dist/tts/tts.js +107 -5
  102. package/dist/tts/tts.js.map +1 -1
  103. package/dist/utils.cjs +11 -4
  104. package/dist/utils.cjs.map +1 -1
  105. package/dist/utils.d.ts.map +1 -1
  106. package/dist/utils.js +11 -4
  107. package/dist/utils.js.map +1 -1
  108. package/dist/vad.cjs +43 -2
  109. package/dist/vad.cjs.map +1 -1
  110. package/dist/vad.d.ts +21 -4
  111. package/dist/vad.d.ts.map +1 -1
  112. package/dist/vad.js +43 -2
  113. package/dist/vad.js.map +1 -1
  114. package/dist/worker.cjs +5 -2
  115. package/dist/worker.cjs.map +1 -1
  116. package/dist/worker.d.ts.map +1 -1
  117. package/dist/worker.js +5 -2
  118. package/dist/worker.js.map +1 -1
  119. package/package.json +3 -3
  120. package/src/index.ts +2 -1
  121. package/src/job.ts +3 -3
  122. package/src/llm/index.ts +2 -0
  123. package/src/llm/llm.ts +55 -3
  124. package/src/metrics/base.ts +127 -0
  125. package/src/metrics/index.ts +20 -0
  126. package/src/metrics/usage_collector.ts +40 -0
  127. package/src/metrics/utils.ts +100 -0
  128. package/src/multimodal/multimodal_agent.ts +57 -23
  129. package/src/pipeline/index.ts +1 -1
  130. package/src/pipeline/pipeline_agent.ts +208 -89
  131. package/src/pipeline/speech_handle.ts +67 -2
  132. package/src/stt/index.ts +2 -0
  133. package/src/stt/stream_adapter.ts +17 -5
  134. package/src/stt/stt.ts +67 -3
  135. package/src/tts/index.ts +2 -0
  136. package/src/tts/stream_adapter.ts +17 -4
  137. package/src/tts/tts.ts +127 -4
  138. package/src/utils.ts +12 -4
  139. package/src/vad.ts +61 -4
  140. package/src/worker.ts +7 -3
@@ -0,0 +1,96 @@
1
+ export interface LLMMetrics {
2
+ requestId: string;
3
+ timestamp: number;
4
+ ttft: number;
5
+ duration: number;
6
+ label: string;
7
+ cancelled: boolean;
8
+ completionTokens: number;
9
+ promptTokens: number;
10
+ totalTokens: number;
11
+ tokensPerSecond: number;
12
+ error?: Error;
13
+ }
14
+ export interface STTMetrics {
15
+ requestId: string;
16
+ timestamp: number;
17
+ duration: number;
18
+ label: string;
19
+ audioDuration: number;
20
+ streamed: boolean;
21
+ error?: Error;
22
+ }
23
+ export interface TTSMetrics {
24
+ requestId: string;
25
+ timestamp: number;
26
+ ttfb: number;
27
+ duration: number;
28
+ label: string;
29
+ audioDuration: number;
30
+ cancelled: boolean;
31
+ charactersCount: number;
32
+ streamed: boolean;
33
+ error?: Error;
34
+ }
35
+ export interface VADMetrics {
36
+ timestamp: number;
37
+ idleTime: number;
38
+ inferenceDurationTotal: number;
39
+ inferenceCount: number;
40
+ label: string;
41
+ }
42
+ export interface PipelineEOUMetrics {
43
+ /**
44
+ * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics
45
+ */
46
+ sequenceId: string;
47
+ /** Timestamp of when the event was recorded */
48
+ timestamp: number;
49
+ /** Amount of time between the end of speech from VAD and the decision to end the user's turn */
50
+ endOfUtteranceDelay: number;
51
+ /**
52
+ * Time taken to obtain the transcript after the end of the user's speech.
53
+ *
54
+ * @remarks
55
+ * May be 0 if the transcript was already available.
56
+ */
57
+ transcriptionDelay: number;
58
+ }
59
+ export interface PipelineLLMMetrics extends LLMMetrics {
60
+ /**
61
+ * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics
62
+ */
63
+ sequenceId: string;
64
+ }
65
+ export interface PipelineTTSMetrics extends TTSMetrics {
66
+ /**
67
+ * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics
68
+ */
69
+ sequenceId: string;
70
+ }
71
+ export type PipelineSTTMetrics = STTMetrics;
72
+ export type PipelineVADMetrics = VADMetrics;
73
+ export declare class MultimodalLLMError extends Error {
74
+ type?: string;
75
+ reason?: string;
76
+ code?: string;
77
+ constructor({ type, reason, code, message, }?: {
78
+ type?: string;
79
+ reason?: string;
80
+ code?: string;
81
+ message?: string;
82
+ }, options?: ErrorOptions);
83
+ }
84
+ export interface MultimodalLLMMetrics extends LLMMetrics {
85
+ inputTokenDetails: {
86
+ cachedTokens: number;
87
+ textTokens: number;
88
+ audioTokens: number;
89
+ };
90
+ outputTokenDetails: {
91
+ textTokens: number;
92
+ audioTokens: number;
93
+ };
94
+ }
95
+ export type AgentMetrics = STTMetrics | LLMMetrics | TTSMetrics | VADMetrics | PipelineSTTMetrics | PipelineEOUMetrics | PipelineLLMMetrics | PipelineTTSMetrics | PipelineVADMetrics | MultimodalLLMMetrics;
96
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/metrics/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ class MultimodalLLMError extends Error {
2
+ type;
3
+ reason;
4
+ code;
5
+ constructor({
6
+ type,
7
+ reason,
8
+ code,
9
+ message
10
+ } = {}, options) {
11
+ super(message, options);
12
+ this.type = type;
13
+ this.reason = reason;
14
+ this.code = code;
15
+ }
16
+ }
17
+ export {
18
+ MultimodalLLMError
19
+ };
20
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/base.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport interface LLMMetrics {\n requestId: string;\n timestamp: number;\n ttft: number;\n duration: number;\n label: string;\n cancelled: boolean;\n completionTokens: number;\n promptTokens: number;\n totalTokens: number;\n tokensPerSecond: number;\n error?: Error;\n}\n\nexport interface STTMetrics {\n requestId: string;\n timestamp: number;\n duration: number;\n label: string;\n audioDuration: number;\n streamed: boolean;\n error?: Error;\n}\n\nexport interface TTSMetrics {\n requestId: string;\n timestamp: number;\n ttfb: number;\n duration: number;\n label: string;\n audioDuration: number;\n cancelled: boolean;\n charactersCount: number;\n streamed: boolean;\n error?: Error;\n}\n\nexport interface VADMetrics {\n timestamp: number;\n idleTime: number;\n inferenceDurationTotal: number;\n inferenceCount: number;\n label: string;\n}\n\nexport interface PipelineEOUMetrics {\n /**\n * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics\n */\n sequenceId: string;\n /** Timestamp of when the event was recorded */\n timestamp: number;\n /** Amount of time between the end of speech from VAD and the decision to end the user's turn */\n endOfUtteranceDelay: number;\n /**\n * Time taken to obtain the transcript after the end of the user's speech.\n *\n * @remarks\n * May be 0 if the transcript was already available.\n */\n transcriptionDelay: number;\n}\n\nexport interface PipelineLLMMetrics extends LLMMetrics {\n /**\n * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics\n */\n sequenceId: string;\n}\n\nexport interface PipelineTTSMetrics extends TTSMetrics {\n /**\n * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics\n */\n sequenceId: string;\n}\n\nexport type PipelineSTTMetrics = STTMetrics;\nexport type PipelineVADMetrics = VADMetrics;\n\nexport class MultimodalLLMError extends Error {\n type?: string;\n reason?: string;\n code?: string;\n constructor(\n {\n type,\n reason,\n code,\n message,\n }: { type?: string; reason?: string; code?: string; message?: string } = {},\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.type = type;\n this.reason = reason;\n this.code = code;\n }\n}\n\nexport interface MultimodalLLMMetrics extends LLMMetrics {\n inputTokenDetails: {\n cachedTokens: number;\n textTokens: number;\n audioTokens: number;\n };\n outputTokenDetails: {\n textTokens: number;\n audioTokens: number;\n };\n}\n\nexport type AgentMetrics =\n | STTMetrics\n | LLMMetrics\n | TTSMetrics\n | VADMetrics\n | PipelineSTTMetrics\n | PipelineEOUMetrics\n | PipelineLLMMetrics\n | PipelineTTSMetrics\n | PipelineVADMetrics\n | MultimodalLLMMetrics;\n"],"mappings":"AAoFO,MAAM,2BAA2B,MAAM;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA,YACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAyE,CAAC,GAC1E,SACA;AACA,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var metrics_exports = {};
20
+ __export(metrics_exports, {
21
+ MultimodalLLMError: () => import_base.MultimodalLLMError,
22
+ UsageCollector: () => import_usage_collector.UsageCollector,
23
+ logMetrics: () => import_utils.logMetrics
24
+ });
25
+ module.exports = __toCommonJS(metrics_exports);
26
+ var import_base = require("./base.cjs");
27
+ var import_usage_collector = require("./usage_collector.cjs");
28
+ var import_utils = require("./utils.cjs");
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ MultimodalLLMError,
32
+ UsageCollector,
33
+ logMetrics
34
+ });
35
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type {\n AgentMetrics,\n STTMetrics,\n LLMMetrics,\n TTSMetrics,\n VADMetrics,\n PipelineSTTMetrics,\n PipelineEOUMetrics,\n PipelineLLMMetrics,\n PipelineTTSMetrics,\n PipelineVADMetrics,\n MultimodalLLMMetrics,\n} from './base.js';\nexport { MultimodalLLMError } from './base.js';\nexport { type UsageSummary, UsageCollector } from './usage_collector.js';\nexport { logMetrics } from './utils.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,kBAAmC;AACnC,6BAAkD;AAClD,mBAA2B;","names":[]}
@@ -0,0 +1,5 @@
1
+ export type { AgentMetrics, STTMetrics, LLMMetrics, TTSMetrics, VADMetrics, PipelineSTTMetrics, PipelineEOUMetrics, PipelineLLMMetrics, PipelineTTSMetrics, PipelineVADMetrics, MultimodalLLMMetrics, } from './base.js';
2
+ export { MultimodalLLMError } from './base.js';
3
+ export { type UsageSummary, UsageCollector } from './usage_collector.js';
4
+ export { logMetrics } from './utils.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { MultimodalLLMError } from "./base.js";
2
+ import { UsageCollector } from "./usage_collector.js";
3
+ import { logMetrics } from "./utils.js";
4
+ export {
5
+ MultimodalLLMError,
6
+ UsageCollector,
7
+ logMetrics
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type {\n AgentMetrics,\n STTMetrics,\n LLMMetrics,\n TTSMetrics,\n VADMetrics,\n PipelineSTTMetrics,\n PipelineEOUMetrics,\n PipelineLLMMetrics,\n PipelineTTSMetrics,\n PipelineVADMetrics,\n MultimodalLLMMetrics,\n} from './base.js';\nexport { MultimodalLLMError } from './base.js';\nexport { type UsageSummary, UsageCollector } from './usage_collector.js';\nexport { logMetrics } from './utils.js';\n"],"mappings":"AAiBA,SAAS,0BAA0B;AACnC,SAA4B,sBAAsB;AAClD,SAAS,kBAAkB;","names":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var usage_collector_exports = {};
20
+ __export(usage_collector_exports, {
21
+ UsageCollector: () => UsageCollector
22
+ });
23
+ module.exports = __toCommonJS(usage_collector_exports);
24
+ var import_utils = require("./utils.cjs");
25
+ class UsageCollector {
26
+ #summary;
27
+ constructor() {
28
+ this.#summary = {
29
+ llmPromptTokens: 0,
30
+ llmCompletionTokens: 0,
31
+ ttsCharactersCount: 0,
32
+ sttAudioDuration: 0
33
+ };
34
+ }
35
+ collect(metrics) {
36
+ if ((0, import_utils.isLLMMetrics)(metrics)) {
37
+ this.#summary.llmPromptTokens += metrics.promptTokens;
38
+ this.#summary.llmCompletionTokens += metrics.completionTokens;
39
+ } else if ((0, import_utils.isTTSMetrics)(metrics)) {
40
+ this.#summary.ttsCharactersCount += metrics.charactersCount;
41
+ } else if ((0, import_utils.isSTTMetrics)(metrics)) {
42
+ this.#summary.sttAudioDuration += metrics.audioDuration;
43
+ }
44
+ }
45
+ get summary() {
46
+ return { ...this.#summary };
47
+ }
48
+ }
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ UsageCollector
52
+ });
53
+ //# sourceMappingURL=usage_collector.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/usage_collector.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AgentMetrics } from './base.js';\nimport { isLLMMetrics, isSTTMetrics, isTTSMetrics } from './utils.js';\n\nexport interface UsageSummary {\n llmPromptTokens: number;\n llmCompletionTokens: number;\n ttsCharactersCount: number;\n sttAudioDuration: number;\n}\n\nexport class UsageCollector {\n #summary: UsageSummary;\n\n constructor() {\n this.#summary = {\n llmPromptTokens: 0,\n llmCompletionTokens: 0,\n ttsCharactersCount: 0,\n sttAudioDuration: 0,\n };\n }\n\n collect(metrics: AgentMetrics) {\n if (isLLMMetrics(metrics)) {\n this.#summary.llmPromptTokens += metrics.promptTokens;\n this.#summary.llmCompletionTokens += metrics.completionTokens;\n } else if (isTTSMetrics(metrics)) {\n this.#summary.ttsCharactersCount += metrics.charactersCount;\n } else if (isSTTMetrics(metrics)) {\n this.#summary.sttAudioDuration += metrics.audioDuration;\n }\n }\n\n get summary(): UsageSummary {\n return { ...this.#summary };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,mBAAyD;AASlD,MAAM,eAAe;AAAA,EAC1B;AAAA,EAEA,cAAc;AACZ,SAAK,WAAW;AAAA,MACd,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,QAAQ,SAAuB;AAC7B,YAAI,2BAAa,OAAO,GAAG;AACzB,WAAK,SAAS,mBAAmB,QAAQ;AACzC,WAAK,SAAS,uBAAuB,QAAQ;AAAA,IAC/C,eAAW,2BAAa,OAAO,GAAG;AAChC,WAAK,SAAS,sBAAsB,QAAQ;AAAA,IAC9C,eAAW,2BAAa,OAAO,GAAG;AAChC,WAAK,SAAS,oBAAoB,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,IAAI,UAAwB;AAC1B,WAAO,EAAE,GAAG,KAAK,SAAS;AAAA,EAC5B;AACF;","names":[]}
@@ -0,0 +1,14 @@
1
+ import type { AgentMetrics } from './base.js';
2
+ export interface UsageSummary {
3
+ llmPromptTokens: number;
4
+ llmCompletionTokens: number;
5
+ ttsCharactersCount: number;
6
+ sttAudioDuration: number;
7
+ }
8
+ export declare class UsageCollector {
9
+ #private;
10
+ constructor();
11
+ collect(metrics: AgentMetrics): void;
12
+ get summary(): UsageSummary;
13
+ }
14
+ //# sourceMappingURL=usage_collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage_collector.d.ts","sourceRoot":"","sources":["../../src/metrics/usage_collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAc;;;IAYzB,OAAO,CAAC,OAAO,EAAE,YAAY;IAW7B,IAAI,OAAO,IAAI,YAAY,CAE1B;CACF"}
@@ -0,0 +1,29 @@
1
+ import { isLLMMetrics, isSTTMetrics, isTTSMetrics } from "./utils.js";
2
+ class UsageCollector {
3
+ #summary;
4
+ constructor() {
5
+ this.#summary = {
6
+ llmPromptTokens: 0,
7
+ llmCompletionTokens: 0,
8
+ ttsCharactersCount: 0,
9
+ sttAudioDuration: 0
10
+ };
11
+ }
12
+ collect(metrics) {
13
+ if (isLLMMetrics(metrics)) {
14
+ this.#summary.llmPromptTokens += metrics.promptTokens;
15
+ this.#summary.llmCompletionTokens += metrics.completionTokens;
16
+ } else if (isTTSMetrics(metrics)) {
17
+ this.#summary.ttsCharactersCount += metrics.charactersCount;
18
+ } else if (isSTTMetrics(metrics)) {
19
+ this.#summary.sttAudioDuration += metrics.audioDuration;
20
+ }
21
+ }
22
+ get summary() {
23
+ return { ...this.#summary };
24
+ }
25
+ }
26
+ export {
27
+ UsageCollector
28
+ };
29
+ //# sourceMappingURL=usage_collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/usage_collector.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AgentMetrics } from './base.js';\nimport { isLLMMetrics, isSTTMetrics, isTTSMetrics } from './utils.js';\n\nexport interface UsageSummary {\n llmPromptTokens: number;\n llmCompletionTokens: number;\n ttsCharactersCount: number;\n sttAudioDuration: number;\n}\n\nexport class UsageCollector {\n #summary: UsageSummary;\n\n constructor() {\n this.#summary = {\n llmPromptTokens: 0,\n llmCompletionTokens: 0,\n ttsCharactersCount: 0,\n sttAudioDuration: 0,\n };\n }\n\n collect(metrics: AgentMetrics) {\n if (isLLMMetrics(metrics)) {\n this.#summary.llmPromptTokens += metrics.promptTokens;\n this.#summary.llmCompletionTokens += metrics.completionTokens;\n } else if (isTTSMetrics(metrics)) {\n this.#summary.ttsCharactersCount += metrics.charactersCount;\n } else if (isSTTMetrics(metrics)) {\n this.#summary.sttAudioDuration += metrics.audioDuration;\n }\n }\n\n get summary(): UsageSummary {\n return { ...this.#summary };\n }\n}\n"],"mappings":"AAIA,SAAS,cAAc,cAAc,oBAAoB;AASlD,MAAM,eAAe;AAAA,EAC1B;AAAA,EAEA,cAAc;AACZ,SAAK,WAAW;AAAA,MACd,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,QAAQ,SAAuB;AAC7B,QAAI,aAAa,OAAO,GAAG;AACzB,WAAK,SAAS,mBAAmB,QAAQ;AACzC,WAAK,SAAS,uBAAuB,QAAQ;AAAA,IAC/C,WAAW,aAAa,OAAO,GAAG;AAChC,WAAK,SAAS,sBAAsB,QAAQ;AAAA,IAC9C,WAAW,aAAa,OAAO,GAAG;AAChC,WAAK,SAAS,oBAAoB,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,IAAI,UAAwB;AAC1B,WAAO,EAAE,GAAG,KAAK,SAAS;AAAA,EAC5B;AACF;","names":[]}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var utils_exports = {};
20
+ __export(utils_exports, {
21
+ isLLMMetrics: () => isLLMMetrics,
22
+ isPipelineEOUMetrics: () => isPipelineEOUMetrics,
23
+ isPipelineLLMMetrics: () => isPipelineLLMMetrics,
24
+ isPipelineTTSMetrics: () => isPipelineTTSMetrics,
25
+ isSTTMetrics: () => isSTTMetrics,
26
+ isTTSMetrics: () => isTTSMetrics,
27
+ isVADMetrics: () => isVADMetrics,
28
+ logMetrics: () => logMetrics
29
+ });
30
+ module.exports = __toCommonJS(utils_exports);
31
+ var import_log = require("../log.cjs");
32
+ const logMetrics = (metrics) => {
33
+ const logger = (0, import_log.log)();
34
+ if (isPipelineLLMMetrics(metrics)) {
35
+ logger.child({
36
+ sequenceId: metrics.sequenceId,
37
+ ttft: metrics.ttft,
38
+ inputTokens: metrics.promptTokens,
39
+ outputTokens: metrics.completionTokens,
40
+ tokensPerSecond: metrics.tokensPerSecond
41
+ }).info("Pipeline LLM metrics");
42
+ } else if (isLLMMetrics(metrics)) {
43
+ logger.child({
44
+ ttft: metrics.ttft,
45
+ inputTokens: metrics.promptTokens,
46
+ outputTokens: metrics.completionTokens,
47
+ tokensPerSecond: metrics.tokensPerSecond
48
+ }).info("LLM metrics");
49
+ } else if (isPipelineTTSMetrics(metrics)) {
50
+ logger.child({
51
+ sequenceId: metrics.sequenceId,
52
+ ttfb: metrics.ttfb,
53
+ audioDuration: metrics.audioDuration
54
+ }).info("Pipeline TTS metrics");
55
+ } else if (isTTSMetrics(metrics)) {
56
+ logger.child({
57
+ ttfb: metrics.ttfb,
58
+ audioDuration: metrics.audioDuration
59
+ }).info("TTS metrics");
60
+ } else if (isPipelineEOUMetrics(metrics)) {
61
+ logger.child({
62
+ sequenceId: metrics.sequenceId,
63
+ endOfUtteranceDelay: metrics.endOfUtteranceDelay,
64
+ transcriptionDelay: metrics.transcriptionDelay
65
+ }).info("Pipeline EOU metrics");
66
+ } else if (isSTTMetrics(metrics)) {
67
+ logger.child({
68
+ audioDuration: metrics.audioDuration
69
+ }).info("STT metrics");
70
+ }
71
+ };
72
+ const isLLMMetrics = (metrics) => {
73
+ return !!metrics.ttft;
74
+ };
75
+ const isPipelineLLMMetrics = (metrics) => {
76
+ return isLLMMetrics(metrics) && !!metrics.sequenceId;
77
+ };
78
+ const isVADMetrics = (metrics) => {
79
+ return !!metrics.inferenceCount;
80
+ };
81
+ const isPipelineEOUMetrics = (metrics) => {
82
+ return !!metrics.endOfUtteranceDelay;
83
+ };
84
+ const isTTSMetrics = (metrics) => {
85
+ return !!metrics.ttfb;
86
+ };
87
+ const isPipelineTTSMetrics = (metrics) => {
88
+ return isTTSMetrics(metrics) && !!metrics.sequenceId;
89
+ };
90
+ const isSTTMetrics = (metrics) => {
91
+ return !(isLLMMetrics(metrics) || isVADMetrics(metrics) || isPipelineEOUMetrics(metrics) || isTTSMetrics(metrics));
92
+ };
93
+ // Annotate the CommonJS export names for ESM import in node:
94
+ 0 && (module.exports = {
95
+ isLLMMetrics,
96
+ isPipelineEOUMetrics,
97
+ isPipelineLLMMetrics,
98
+ isPipelineTTSMetrics,
99
+ isSTTMetrics,
100
+ isTTSMetrics,
101
+ isVADMetrics,
102
+ logMetrics
103
+ });
104
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type {\n AgentMetrics,\n LLMMetrics,\n PipelineEOUMetrics,\n PipelineLLMMetrics,\n PipelineTTSMetrics,\n STTMetrics,\n TTSMetrics,\n VADMetrics,\n} from './base.js';\n\nexport const logMetrics = (metrics: AgentMetrics) => {\n const logger = log();\n if (isPipelineLLMMetrics(metrics)) {\n logger\n .child({\n sequenceId: metrics.sequenceId,\n ttft: metrics.ttft,\n inputTokens: metrics.promptTokens,\n outputTokens: metrics.completionTokens,\n tokensPerSecond: metrics.tokensPerSecond,\n })\n .info('Pipeline LLM metrics');\n } else if (isLLMMetrics(metrics)) {\n logger\n .child({\n ttft: metrics.ttft,\n inputTokens: metrics.promptTokens,\n outputTokens: metrics.completionTokens,\n tokensPerSecond: metrics.tokensPerSecond,\n })\n .info('LLM metrics');\n } else if (isPipelineTTSMetrics(metrics)) {\n logger\n .child({\n sequenceId: metrics.sequenceId,\n ttfb: metrics.ttfb,\n audioDuration: metrics.audioDuration,\n })\n .info('Pipeline TTS metrics');\n } else if (isTTSMetrics(metrics)) {\n logger\n .child({\n ttfb: metrics.ttfb,\n audioDuration: metrics.audioDuration,\n })\n .info('TTS metrics');\n } else if (isPipelineEOUMetrics(metrics)) {\n logger\n .child({\n sequenceId: metrics.sequenceId,\n endOfUtteranceDelay: metrics.endOfUtteranceDelay,\n transcriptionDelay: metrics.transcriptionDelay,\n })\n .info('Pipeline EOU metrics');\n } else if (isSTTMetrics(metrics)) {\n logger\n .child({\n audioDuration: metrics.audioDuration,\n })\n .info('STT metrics');\n }\n};\n\nexport const isLLMMetrics = (metrics: AgentMetrics): metrics is LLMMetrics => {\n return !!(metrics as LLMMetrics).ttft;\n};\n\nexport const isPipelineLLMMetrics = (metrics: AgentMetrics): metrics is PipelineLLMMetrics => {\n return isLLMMetrics(metrics) && !!(metrics as PipelineLLMMetrics).sequenceId;\n};\n\nexport const isVADMetrics = (metrics: AgentMetrics): metrics is VADMetrics => {\n return !!(metrics as VADMetrics).inferenceCount;\n};\n\nexport const isPipelineEOUMetrics = (metrics: AgentMetrics): metrics is PipelineEOUMetrics => {\n return !!(metrics as PipelineEOUMetrics).endOfUtteranceDelay;\n};\n\nexport const isTTSMetrics = (metrics: AgentMetrics): metrics is TTSMetrics => {\n return !!(metrics as TTSMetrics).ttfb;\n};\n\nexport const isPipelineTTSMetrics = (metrics: AgentMetrics): metrics is PipelineTTSMetrics => {\n return isTTSMetrics(metrics) && !!(metrics as PipelineTTSMetrics).sequenceId;\n};\n\nexport const isSTTMetrics = (metrics: AgentMetrics): metrics is STTMetrics => {\n return !(\n isLLMMetrics(metrics) ||\n isVADMetrics(metrics) ||\n isPipelineEOUMetrics(metrics) ||\n isTTSMetrics(metrics)\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAoB;AAYb,MAAM,aAAa,CAAC,YAA0B;AACnD,QAAM,aAAS,gBAAI;AACnB,MAAI,qBAAqB,OAAO,GAAG;AACjC,WACG,MAAM;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,MACtB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC,WAAW,aAAa,OAAO,GAAG;AAChC,WACG,MAAM;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,MACtB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,qBAAqB,OAAO,GAAG;AACxC,WACG,MAAM;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd,eAAe,QAAQ;AAAA,IACzB,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC,WAAW,aAAa,OAAO,GAAG;AAChC,WACG,MAAM;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,eAAe,QAAQ;AAAA,IACzB,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,qBAAqB,OAAO,GAAG;AACxC,WACG,MAAM;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,qBAAqB,QAAQ;AAAA,MAC7B,oBAAoB,QAAQ;AAAA,IAC9B,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC,WAAW,aAAa,OAAO,GAAG;AAChC,WACG,MAAM;AAAA,MACL,eAAe,QAAQ;AAAA,IACzB,CAAC,EACA,KAAK,aAAa;AAAA,EACvB;AACF;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,CAAC,CAAE,QAAuB;AACnC;AAEO,MAAM,uBAAuB,CAAC,YAAyD;AAC5F,SAAO,aAAa,OAAO,KAAK,CAAC,CAAE,QAA+B;AACpE;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,CAAC,CAAE,QAAuB;AACnC;AAEO,MAAM,uBAAuB,CAAC,YAAyD;AAC5F,SAAO,CAAC,CAAE,QAA+B;AAC3C;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,CAAC,CAAE,QAAuB;AACnC;AAEO,MAAM,uBAAuB,CAAC,YAAyD;AAC5F,SAAO,aAAa,OAAO,KAAK,CAAC,CAAE,QAA+B;AACpE;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,EACL,aAAa,OAAO,KACpB,aAAa,OAAO,KACpB,qBAAqB,OAAO,KAC5B,aAAa,OAAO;AAExB;","names":[]}
@@ -0,0 +1,10 @@
1
+ import type { AgentMetrics, LLMMetrics, PipelineEOUMetrics, PipelineLLMMetrics, PipelineTTSMetrics, STTMetrics, TTSMetrics, VADMetrics } from './base.js';
2
+ export declare const logMetrics: (metrics: AgentMetrics) => void;
3
+ export declare const isLLMMetrics: (metrics: AgentMetrics) => metrics is LLMMetrics;
4
+ export declare const isPipelineLLMMetrics: (metrics: AgentMetrics) => metrics is PipelineLLMMetrics;
5
+ export declare const isVADMetrics: (metrics: AgentMetrics) => metrics is VADMetrics;
6
+ export declare const isPipelineEOUMetrics: (metrics: AgentMetrics) => metrics is PipelineEOUMetrics;
7
+ export declare const isTTSMetrics: (metrics: AgentMetrics) => metrics is TTSMetrics;
8
+ export declare const isPipelineTTSMetrics: (metrics: AgentMetrics) => metrics is PipelineTTSMetrics;
9
+ export declare const isSTTMetrics: (metrics: AgentMetrics) => metrics is STTMetrics;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/metrics/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,UAAU,EACX,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,UAAU,YAAa,YAAY,SAmD/C,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,YAAY,0BAEjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,YAAY,kCAEzD,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,YAAY,0BAEjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,YAAY,kCAEzD,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,YAAY,0BAEjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,YAAY,kCAEzD,CAAC;AAEF,eAAO,MAAM,YAAY,YAAa,YAAY,0BAOjD,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { log } from "../log.js";
2
+ const logMetrics = (metrics) => {
3
+ const logger = log();
4
+ if (isPipelineLLMMetrics(metrics)) {
5
+ logger.child({
6
+ sequenceId: metrics.sequenceId,
7
+ ttft: metrics.ttft,
8
+ inputTokens: metrics.promptTokens,
9
+ outputTokens: metrics.completionTokens,
10
+ tokensPerSecond: metrics.tokensPerSecond
11
+ }).info("Pipeline LLM metrics");
12
+ } else if (isLLMMetrics(metrics)) {
13
+ logger.child({
14
+ ttft: metrics.ttft,
15
+ inputTokens: metrics.promptTokens,
16
+ outputTokens: metrics.completionTokens,
17
+ tokensPerSecond: metrics.tokensPerSecond
18
+ }).info("LLM metrics");
19
+ } else if (isPipelineTTSMetrics(metrics)) {
20
+ logger.child({
21
+ sequenceId: metrics.sequenceId,
22
+ ttfb: metrics.ttfb,
23
+ audioDuration: metrics.audioDuration
24
+ }).info("Pipeline TTS metrics");
25
+ } else if (isTTSMetrics(metrics)) {
26
+ logger.child({
27
+ ttfb: metrics.ttfb,
28
+ audioDuration: metrics.audioDuration
29
+ }).info("TTS metrics");
30
+ } else if (isPipelineEOUMetrics(metrics)) {
31
+ logger.child({
32
+ sequenceId: metrics.sequenceId,
33
+ endOfUtteranceDelay: metrics.endOfUtteranceDelay,
34
+ transcriptionDelay: metrics.transcriptionDelay
35
+ }).info("Pipeline EOU metrics");
36
+ } else if (isSTTMetrics(metrics)) {
37
+ logger.child({
38
+ audioDuration: metrics.audioDuration
39
+ }).info("STT metrics");
40
+ }
41
+ };
42
+ const isLLMMetrics = (metrics) => {
43
+ return !!metrics.ttft;
44
+ };
45
+ const isPipelineLLMMetrics = (metrics) => {
46
+ return isLLMMetrics(metrics) && !!metrics.sequenceId;
47
+ };
48
+ const isVADMetrics = (metrics) => {
49
+ return !!metrics.inferenceCount;
50
+ };
51
+ const isPipelineEOUMetrics = (metrics) => {
52
+ return !!metrics.endOfUtteranceDelay;
53
+ };
54
+ const isTTSMetrics = (metrics) => {
55
+ return !!metrics.ttfb;
56
+ };
57
+ const isPipelineTTSMetrics = (metrics) => {
58
+ return isTTSMetrics(metrics) && !!metrics.sequenceId;
59
+ };
60
+ const isSTTMetrics = (metrics) => {
61
+ return !(isLLMMetrics(metrics) || isVADMetrics(metrics) || isPipelineEOUMetrics(metrics) || isTTSMetrics(metrics));
62
+ };
63
+ export {
64
+ isLLMMetrics,
65
+ isPipelineEOUMetrics,
66
+ isPipelineLLMMetrics,
67
+ isPipelineTTSMetrics,
68
+ isSTTMetrics,
69
+ isTTSMetrics,
70
+ isVADMetrics,
71
+ logMetrics
72
+ };
73
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type {\n AgentMetrics,\n LLMMetrics,\n PipelineEOUMetrics,\n PipelineLLMMetrics,\n PipelineTTSMetrics,\n STTMetrics,\n TTSMetrics,\n VADMetrics,\n} from './base.js';\n\nexport const logMetrics = (metrics: AgentMetrics) => {\n const logger = log();\n if (isPipelineLLMMetrics(metrics)) {\n logger\n .child({\n sequenceId: metrics.sequenceId,\n ttft: metrics.ttft,\n inputTokens: metrics.promptTokens,\n outputTokens: metrics.completionTokens,\n tokensPerSecond: metrics.tokensPerSecond,\n })\n .info('Pipeline LLM metrics');\n } else if (isLLMMetrics(metrics)) {\n logger\n .child({\n ttft: metrics.ttft,\n inputTokens: metrics.promptTokens,\n outputTokens: metrics.completionTokens,\n tokensPerSecond: metrics.tokensPerSecond,\n })\n .info('LLM metrics');\n } else if (isPipelineTTSMetrics(metrics)) {\n logger\n .child({\n sequenceId: metrics.sequenceId,\n ttfb: metrics.ttfb,\n audioDuration: metrics.audioDuration,\n })\n .info('Pipeline TTS metrics');\n } else if (isTTSMetrics(metrics)) {\n logger\n .child({\n ttfb: metrics.ttfb,\n audioDuration: metrics.audioDuration,\n })\n .info('TTS metrics');\n } else if (isPipelineEOUMetrics(metrics)) {\n logger\n .child({\n sequenceId: metrics.sequenceId,\n endOfUtteranceDelay: metrics.endOfUtteranceDelay,\n transcriptionDelay: metrics.transcriptionDelay,\n })\n .info('Pipeline EOU metrics');\n } else if (isSTTMetrics(metrics)) {\n logger\n .child({\n audioDuration: metrics.audioDuration,\n })\n .info('STT metrics');\n }\n};\n\nexport const isLLMMetrics = (metrics: AgentMetrics): metrics is LLMMetrics => {\n return !!(metrics as LLMMetrics).ttft;\n};\n\nexport const isPipelineLLMMetrics = (metrics: AgentMetrics): metrics is PipelineLLMMetrics => {\n return isLLMMetrics(metrics) && !!(metrics as PipelineLLMMetrics).sequenceId;\n};\n\nexport const isVADMetrics = (metrics: AgentMetrics): metrics is VADMetrics => {\n return !!(metrics as VADMetrics).inferenceCount;\n};\n\nexport const isPipelineEOUMetrics = (metrics: AgentMetrics): metrics is PipelineEOUMetrics => {\n return !!(metrics as PipelineEOUMetrics).endOfUtteranceDelay;\n};\n\nexport const isTTSMetrics = (metrics: AgentMetrics): metrics is TTSMetrics => {\n return !!(metrics as TTSMetrics).ttfb;\n};\n\nexport const isPipelineTTSMetrics = (metrics: AgentMetrics): metrics is PipelineTTSMetrics => {\n return isTTSMetrics(metrics) && !!(metrics as PipelineTTSMetrics).sequenceId;\n};\n\nexport const isSTTMetrics = (metrics: AgentMetrics): metrics is STTMetrics => {\n return !(\n isLLMMetrics(metrics) ||\n isVADMetrics(metrics) ||\n isPipelineEOUMetrics(metrics) ||\n isTTSMetrics(metrics)\n );\n};\n"],"mappings":"AAGA,SAAS,WAAW;AAYb,MAAM,aAAa,CAAC,YAA0B;AACnD,QAAM,SAAS,IAAI;AACnB,MAAI,qBAAqB,OAAO,GAAG;AACjC,WACG,MAAM;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,MACtB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC,WAAW,aAAa,OAAO,GAAG;AAChC,WACG,MAAM;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,MACtB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,qBAAqB,OAAO,GAAG;AACxC,WACG,MAAM;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd,eAAe,QAAQ;AAAA,IACzB,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC,WAAW,aAAa,OAAO,GAAG;AAChC,WACG,MAAM;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,eAAe,QAAQ;AAAA,IACzB,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,qBAAqB,OAAO,GAAG;AACxC,WACG,MAAM;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,qBAAqB,QAAQ;AAAA,MAC7B,oBAAoB,QAAQ;AAAA,IAC9B,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC,WAAW,aAAa,OAAO,GAAG;AAChC,WACG,MAAM;AAAA,MACL,eAAe,QAAQ;AAAA,IACzB,CAAC,EACA,KAAK,aAAa;AAAA,EACvB;AACF;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,CAAC,CAAE,QAAuB;AACnC;AAEO,MAAM,uBAAuB,CAAC,YAAyD;AAC5F,SAAO,aAAa,OAAO,KAAK,CAAC,CAAE,QAA+B;AACpE;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,CAAC,CAAE,QAAuB;AACnC;AAEO,MAAM,uBAAuB,CAAC,YAAyD;AAC5F,SAAO,CAAC,CAAE,QAA+B;AAC3C;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,CAAC,CAAE,QAAuB;AACnC;AAEO,MAAM,uBAAuB,CAAC,YAAyD;AAC5F,SAAO,aAAa,OAAO,KAAK,CAAC,CAAE,QAA+B;AACpE;AAEO,MAAM,eAAe,CAAC,YAAiD;AAC5E,SAAO,EACL,aAAa,OAAO,KACpB,aAAa,OAAO,KACpB,qBAAqB,OAAO,KAC5B,aAAa,OAAO;AAExB;","names":[]}
@@ -53,15 +53,19 @@ class MultimodalAgent extends import_node_events.EventEmitter {
53
53
  linkedParticipant = null;
54
54
  subscribedTrack = null;
55
55
  readMicroTask = null;
56
+ #textResponseRetries = 0;
57
+ #maxTextResponseRetries;
56
58
  constructor({
57
59
  model,
58
60
  chatCtx,
59
- fncCtx
61
+ fncCtx,
62
+ maxTextResponseRetries = 5
60
63
  }) {
61
64
  super();
62
65
  this.model = model;
63
66
  this.#chatCtx = chatCtx;
64
67
  this.#fncCtx = fncCtx;
68
+ this.#maxTextResponseRetries = maxTextResponseRetries;
65
69
  }
66
70
  #participant = null;
67
71
  #agentPublication = null;
@@ -190,6 +194,7 @@ class MultimodalAgent extends import_node_events.EventEmitter {
190
194
  this.#started = true;
191
195
  this.#session.on("response_content_added", (message) => {
192
196
  var _a2;
197
+ if (message.contentType === "text") return;
193
198
  const trFwd = new import_transcription.BasicTranscriptionForwarder(
194
199
  this.room,
195
200
  this.room.localParticipant.identity,
@@ -205,6 +210,26 @@ class MultimodalAgent extends import_node_events.EventEmitter {
205
210
  );
206
211
  this.#playingHandle = handle;
207
212
  });
213
+ this.#session.on("response_content_done", (message) => {
214
+ if (message.contentType === "text") {
215
+ if (this.#textResponseRetries >= this.#maxTextResponseRetries) {
216
+ throw new Error(
217
+ `The OpenAI Realtime API returned a text response after ${this.#maxTextResponseRetries} retries. Please try to reduce the number of text system or assistant messages in the chat context.`
218
+ );
219
+ }
220
+ this.#textResponseRetries++;
221
+ this.#logger.child({
222
+ itemId: message.itemId,
223
+ text: message.text,
224
+ retries: this.#textResponseRetries
225
+ }).warn(
226
+ "The OpenAI Realtime API returned a text response instead of audio. Attempting to recover to audio mode..."
227
+ );
228
+ this.#session.recoverFromTextResponse(message.itemId);
229
+ } else {
230
+ this.#textResponseRetries = 0;
231
+ }
232
+ });
208
233
  this.#session.on("input_speech_committed", (ev) => {
209
234
  var _a2, _b;
210
235
  const participantIdentity = (_a2 = this.linkedParticipant) == null ? void 0 : _a2.identity;
@@ -234,6 +259,7 @@ class MultimodalAgent extends import_node_events.EventEmitter {
234
259
  });
235
260
  this.#session.on("input_speech_started", (ev) => {
236
261
  var _a2, _b;
262
+ this.emit("user_started_speaking");
237
263
  if (this.#playingHandle && !this.#playingHandle.done) {
238
264
  this.#playingHandle.interrupt();
239
265
  this.#session.conversation.item.truncate(
@@ -264,6 +290,9 @@ class MultimodalAgent extends import_node_events.EventEmitter {
264
290
  this.#pendingFunctionCalls.delete(ev.callId);
265
291
  this.#updateState();
266
292
  });
293
+ this.#session.on("metrics_collected", (metrics) => {
294
+ this.emit("metrics_collected", metrics);
295
+ });
267
296
  resolve(this.#session);
268
297
  });
269
298
  }
@@ -325,24 +354,13 @@ class MultimodalAgent extends import_node_events.EventEmitter {
325
354
  }
326
355
  };
327
356
  this.subscribedTrack = track;
328
- if (this.readMicroTask) {
329
- this.readMicroTask.cancel();
330
- }
331
- let cancel;
332
- this.readMicroTask = {
333
- promise: new Promise((resolve, reject) => {
334
- cancel = () => {
335
- reject(new Error("Task cancelled"));
336
- };
337
- readAudioStreamTask(new import_rtc_node.AudioStream(track, this.model.sampleRate, this.model.numChannels)).then(resolve).catch(reject);
338
- }),
339
- cancel: () => cancel()
340
- };
357
+ this.readMicroTask = new Promise((resolve, reject) => {
358
+ readAudioStreamTask(new import_rtc_node.AudioStream(track, this.model.sampleRate, this.model.numChannels)).then(resolve).catch(reject);
359
+ });
341
360
  }
342
361
  #getLocalTrackSid() {
343
- var _a;
344
362
  if (!this.#localTrackSid && this.room && this.room.localParticipant) {
345
- this.#localTrackSid = (0, import_utils.findMicroTrackId)(this.room, (_a = this.room.localParticipant) == null ? void 0 : _a.identity);
363
+ this.#localTrackSid = (0, import_utils.findMicroTrackId)(this.room, this.room.localParticipant.identity);
346
364
  }
347
365
  return this.#localTrackSid;
348
366
  }