@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.
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/job.cjs.map +1 -1
- package/dist/job.js.map +1 -1
- package/dist/llm/index.cjs +2 -0
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.ts +1 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +2 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +47 -3
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.ts +15 -2
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +46 -3
- package/dist/llm/llm.js.map +1 -1
- package/dist/metrics/base.cjs +44 -0
- package/dist/metrics/base.cjs.map +1 -0
- package/dist/metrics/base.d.ts +96 -0
- package/dist/metrics/base.d.ts.map +1 -0
- package/dist/metrics/base.js +20 -0
- package/dist/metrics/base.js.map +1 -0
- package/dist/metrics/index.cjs +35 -0
- package/dist/metrics/index.cjs.map +1 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +9 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/usage_collector.cjs +53 -0
- package/dist/metrics/usage_collector.cjs.map +1 -0
- package/dist/metrics/usage_collector.d.ts +14 -0
- package/dist/metrics/usage_collector.d.ts.map +1 -0
- package/dist/metrics/usage_collector.js +29 -0
- package/dist/metrics/usage_collector.js.map +1 -0
- package/dist/metrics/utils.cjs +104 -0
- package/dist/metrics/utils.cjs.map +1 -0
- package/dist/metrics/utils.d.ts +10 -0
- package/dist/metrics/utils.d.ts.map +1 -0
- package/dist/metrics/utils.js +73 -0
- package/dist/metrics/utils.js.map +1 -0
- package/dist/multimodal/multimodal_agent.cjs +34 -16
- package/dist/multimodal/multimodal_agent.cjs.map +1 -1
- package/dist/multimodal/multimodal_agent.d.ts +4 -5
- package/dist/multimodal/multimodal_agent.d.ts.map +1 -1
- package/dist/multimodal/multimodal_agent.js +34 -16
- package/dist/multimodal/multimodal_agent.js.map +1 -1
- package/dist/pipeline/index.cjs +2 -0
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.d.ts +1 -1
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +3 -1
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/pipeline_agent.cjs +166 -66
- package/dist/pipeline/pipeline_agent.cjs.map +1 -1
- package/dist/pipeline/pipeline_agent.d.ts +10 -4
- package/dist/pipeline/pipeline_agent.d.ts.map +1 -1
- package/dist/pipeline/pipeline_agent.js +169 -69
- package/dist/pipeline/pipeline_agent.js.map +1 -1
- package/dist/pipeline/speech_handle.cjs +49 -1
- package/dist/pipeline/speech_handle.cjs.map +1 -1
- package/dist/pipeline/speech_handle.d.ts +12 -2
- package/dist/pipeline/speech_handle.d.ts.map +1 -1
- package/dist/pipeline/speech_handle.js +50 -2
- package/dist/pipeline/speech_handle.js.map +1 -1
- package/dist/stt/index.cjs.map +1 -1
- package/dist/stt/index.d.ts +1 -1
- package/dist/stt/index.d.ts.map +1 -1
- package/dist/stt/index.js.map +1 -1
- package/dist/stt/stream_adapter.cjs +15 -5
- package/dist/stt/stream_adapter.cjs.map +1 -1
- package/dist/stt/stream_adapter.d.ts +4 -1
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +15 -5
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.cjs +46 -2
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.ts +25 -3
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +46 -2
- package/dist/stt/stt.js.map +1 -1
- package/dist/tts/index.cjs +4 -2
- package/dist/tts/index.cjs.map +1 -1
- package/dist/tts/index.d.ts +1 -1
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +3 -1
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/stream_adapter.cjs +14 -3
- package/dist/tts/stream_adapter.cjs.map +1 -1
- package/dist/tts/stream_adapter.d.ts +3 -0
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +15 -4
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.cjs +109 -6
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.ts +24 -1
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +107 -5
- package/dist/tts/tts.js.map +1 -1
- package/dist/utils.cjs +11 -4
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +11 -4
- package/dist/utils.js.map +1 -1
- package/dist/vad.cjs +43 -2
- package/dist/vad.cjs.map +1 -1
- package/dist/vad.d.ts +21 -4
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +43 -2
- package/dist/vad.js.map +1 -1
- package/dist/worker.cjs +5 -2
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +5 -2
- package/dist/worker.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -1
- package/src/job.ts +3 -3
- package/src/llm/index.ts +2 -0
- package/src/llm/llm.ts +55 -3
- package/src/metrics/base.ts +127 -0
- package/src/metrics/index.ts +20 -0
- package/src/metrics/usage_collector.ts +40 -0
- package/src/metrics/utils.ts +100 -0
- package/src/multimodal/multimodal_agent.ts +57 -23
- package/src/pipeline/index.ts +1 -1
- package/src/pipeline/pipeline_agent.ts +208 -89
- package/src/pipeline/speech_handle.ts +67 -2
- package/src/stt/index.ts +2 -0
- package/src/stt/stream_adapter.ts +17 -5
- package/src/stt/stt.ts +67 -3
- package/src/tts/index.ts +2 -0
- package/src/tts/stream_adapter.ts +17 -4
- package/src/tts/tts.ts +127 -4
- package/src/utils.ts +12 -4
- package/src/vad.ts +61 -4
- 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 @@
|
|
|
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
|
-
|
|
329
|
-
this.
|
|
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,
|
|
363
|
+
this.#localTrackSid = (0, import_utils.findMicroTrackId)(this.room, this.room.localParticipant.identity);
|
|
346
364
|
}
|
|
347
365
|
return this.#localTrackSid;
|
|
348
366
|
}
|