@livekit/agents 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +47 -0
- package/LICENSE +201 -0
- package/dist/audio.d.ts +9 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +54 -0
- package/dist/audio.js.map +1 -0
- package/dist/cli.d.ts +12 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +102 -19
- package/dist/cli.js.map +1 -1
- package/dist/generator.d.ts +17 -6
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +20 -3
- package/dist/generator.js.map +1 -1
- package/dist/http_server.d.ts +1 -1
- package/dist/http_server.d.ts.map +1 -1
- package/dist/http_server.js +5 -3
- package/dist/http_server.js.map +1 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/ipc/job_executor.d.ts +19 -0
- package/dist/ipc/job_executor.d.ts.map +1 -0
- package/dist/ipc/job_executor.js +8 -0
- package/dist/ipc/job_executor.js.map +1 -0
- package/dist/ipc/job_main.d.ts +7 -4
- package/dist/ipc/job_main.d.ts.map +1 -1
- package/dist/ipc/job_main.js +102 -59
- package/dist/ipc/job_main.js.map +1 -1
- package/dist/ipc/message.d.ts +41 -0
- package/dist/ipc/message.d.ts.map +1 -0
- package/dist/ipc/message.js +2 -0
- package/dist/ipc/message.js.map +1 -0
- package/dist/ipc/proc_job_executor.d.ts +15 -0
- package/dist/ipc/proc_job_executor.d.ts.map +1 -0
- package/dist/ipc/proc_job_executor.js +150 -0
- package/dist/ipc/proc_job_executor.js.map +1 -0
- package/dist/ipc/proc_pool.d.ts +26 -0
- package/dist/ipc/proc_pool.d.ts.map +1 -0
- package/dist/ipc/proc_pool.js +83 -0
- package/dist/ipc/proc_pool.js.map +1 -0
- package/dist/job.d.ts +100 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +213 -0
- package/dist/job.js.map +1 -0
- package/dist/llm/function_context.d.ts +20 -0
- package/dist/llm/function_context.d.ts.map +1 -0
- package/dist/llm/function_context.js +37 -0
- package/dist/llm/function_context.js.map +1 -0
- package/dist/llm/index.d.ts +3 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +6 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/log.d.ts +12 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +28 -11
- package/dist/log.js.map +1 -1
- package/dist/multimodal/agent_playout.d.ts +34 -0
- package/dist/multimodal/agent_playout.d.ts.map +1 -0
- package/dist/multimodal/agent_playout.js +221 -0
- package/dist/multimodal/agent_playout.js.map +1 -0
- package/dist/multimodal/index.d.ts +3 -0
- package/dist/multimodal/index.d.ts.map +1 -0
- package/dist/multimodal/index.js +6 -0
- package/dist/multimodal/index.js.map +1 -0
- package/dist/multimodal/multimodal_agent.d.ts +47 -0
- package/dist/multimodal/multimodal_agent.d.ts.map +1 -0
- package/dist/multimodal/multimodal_agent.js +331 -0
- package/dist/multimodal/multimodal_agent.js.map +1 -0
- package/dist/plugin.js +20 -7
- package/dist/plugin.js.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.d.ts +2 -11
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +47 -33
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.d.ts +27 -0
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +32 -5
- package/dist/stt/stt.js.map +1 -1
- package/dist/transcription.d.ts +22 -0
- package/dist/transcription.d.ts.map +1 -0
- package/dist/transcription.js +111 -0
- package/dist/transcription.js.map +1 -0
- package/dist/tts/stream_adapter.d.ts +4 -11
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +66 -32
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.d.ts +10 -0
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +48 -7
- package/dist/tts/tts.js.map +1 -1
- package/dist/utils.d.ts +59 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +212 -6
- package/dist/utils.js.map +1 -1
- package/dist/vad.d.ts +29 -0
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js.map +1 -1
- package/dist/worker.d.ts +69 -50
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +414 -213
- package/dist/worker.js.map +1 -1
- package/package.json +12 -10
- package/src/audio.ts +62 -0
- package/src/cli.ts +108 -20
- package/src/generator.ts +27 -7
- package/src/http_server.ts +5 -0
- package/src/index.ts +15 -3
- package/src/ipc/job_executor.ts +25 -0
- package/src/ipc/job_main.ts +141 -61
- package/src/ipc/message.ts +39 -0
- package/src/ipc/proc_job_executor.ts +162 -0
- package/src/ipc/proc_pool.ts +109 -0
- package/src/job.ts +278 -0
- package/src/llm/function_context.ts +61 -0
- package/src/llm/index.ts +11 -0
- package/src/log.ts +40 -8
- package/src/multimodal/agent_playout.ts +254 -0
- package/src/multimodal/index.ts +5 -0
- package/src/multimodal/multimodal_agent.ts +428 -0
- package/src/stt/index.ts +1 -1
- package/src/stt/stream_adapter.ts +32 -32
- package/src/stt/stt.ts +27 -0
- package/src/transcription.ts +128 -0
- package/src/tts/stream_adapter.ts +32 -31
- package/src/tts/tts.ts +10 -0
- package/src/utils.ts +257 -3
- package/src/vad.ts +29 -0
- package/src/worker.ts +465 -172
- package/tsconfig.json +7 -1
- package/dist/ipc/job_process.d.ts +0 -22
- package/dist/ipc/job_process.d.ts.map +0 -1
- package/dist/ipc/job_process.js +0 -73
- package/dist/ipc/job_process.js.map +0 -1
- package/dist/ipc/protocol.d.ts +0 -40
- package/dist/ipc/protocol.d.ts.map +0 -1
- package/dist/ipc/protocol.js +0 -14
- package/dist/ipc/protocol.js.map +0 -1
- package/dist/job_context.d.ts +0 -16
- package/dist/job_context.d.ts.map +0 -1
- package/dist/job_context.js +0 -31
- package/dist/job_context.js.map +0 -1
- package/dist/job_request.d.ts +0 -42
- package/dist/job_request.d.ts.map +0 -1
- package/dist/job_request.js +0 -79
- package/dist/job_request.js.map +0 -1
- package/src/ipc/job_process.ts +0 -96
- package/src/ipc/protocol.ts +0 -51
- package/src/job_context.ts +0 -49
- package/src/job_request.ts +0 -118
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
13
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
14
|
+
var m = o[Symbol.asyncIterator], i;
|
|
15
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
16
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
17
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
18
|
+
};
|
|
19
|
+
var _PlayoutHandle_audioSource, _PlayoutHandle_sampleRate, _PlayoutHandle_itemId, _PlayoutHandle_contentIndex, _PlayoutHandle_interrupted, _AgentPlayout_instances, _AgentPlayout_audioSource, _AgentPlayout_playoutTask, _AgentPlayout_sampleRate, _AgentPlayout_numChannels, _AgentPlayout_inFrameSize, _AgentPlayout_outFrameSize, _AgentPlayout_makePlayoutTask;
|
|
20
|
+
import { EventEmitter } from 'events';
|
|
21
|
+
import { AudioByteStream } from '../audio.js';
|
|
22
|
+
import { CancellablePromise, Future, gracefullyCancel } from '../utils.js';
|
|
23
|
+
export const proto = {};
|
|
24
|
+
export class PlayoutHandle extends EventEmitter {
|
|
25
|
+
constructor(audioSource, sampleRate, itemId, contentIndex, transcriptionFwd) {
|
|
26
|
+
super();
|
|
27
|
+
_PlayoutHandle_audioSource.set(this, void 0);
|
|
28
|
+
_PlayoutHandle_sampleRate.set(this, void 0);
|
|
29
|
+
_PlayoutHandle_itemId.set(this, void 0);
|
|
30
|
+
_PlayoutHandle_contentIndex.set(this, void 0);
|
|
31
|
+
/** @internal */
|
|
32
|
+
_PlayoutHandle_interrupted.set(this, void 0);
|
|
33
|
+
__classPrivateFieldSet(this, _PlayoutHandle_audioSource, audioSource, "f");
|
|
34
|
+
__classPrivateFieldSet(this, _PlayoutHandle_sampleRate, sampleRate, "f");
|
|
35
|
+
__classPrivateFieldSet(this, _PlayoutHandle_itemId, itemId, "f");
|
|
36
|
+
__classPrivateFieldSet(this, _PlayoutHandle_contentIndex, contentIndex, "f");
|
|
37
|
+
this.transcriptionFwd = transcriptionFwd;
|
|
38
|
+
this.doneFut = new Future();
|
|
39
|
+
this.intFut = new Future();
|
|
40
|
+
__classPrivateFieldSet(this, _PlayoutHandle_interrupted, false, "f");
|
|
41
|
+
this.pushedDuration = 0;
|
|
42
|
+
this.totalPlayedTime = undefined;
|
|
43
|
+
}
|
|
44
|
+
get itemId() {
|
|
45
|
+
return __classPrivateFieldGet(this, _PlayoutHandle_itemId, "f");
|
|
46
|
+
}
|
|
47
|
+
get audioSamples() {
|
|
48
|
+
if (this.totalPlayedTime !== undefined) {
|
|
49
|
+
return Math.floor(this.totalPlayedTime * __classPrivateFieldGet(this, _PlayoutHandle_sampleRate, "f"));
|
|
50
|
+
}
|
|
51
|
+
return Math.floor(this.pushedDuration - __classPrivateFieldGet(this, _PlayoutHandle_audioSource, "f").queuedDuration * __classPrivateFieldGet(this, _PlayoutHandle_sampleRate, "f"));
|
|
52
|
+
}
|
|
53
|
+
get textChars() {
|
|
54
|
+
return this.transcriptionFwd.currentCharacterIndex;
|
|
55
|
+
}
|
|
56
|
+
get contentIndex() {
|
|
57
|
+
return __classPrivateFieldGet(this, _PlayoutHandle_contentIndex, "f");
|
|
58
|
+
}
|
|
59
|
+
get interrupted() {
|
|
60
|
+
return __classPrivateFieldGet(this, _PlayoutHandle_interrupted, "f");
|
|
61
|
+
}
|
|
62
|
+
get done() {
|
|
63
|
+
return this.doneFut.done || __classPrivateFieldGet(this, _PlayoutHandle_interrupted, "f");
|
|
64
|
+
}
|
|
65
|
+
interrupt() {
|
|
66
|
+
if (this.doneFut.done)
|
|
67
|
+
return;
|
|
68
|
+
this.intFut.resolve();
|
|
69
|
+
__classPrivateFieldSet(this, _PlayoutHandle_interrupted, true, "f");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
_PlayoutHandle_audioSource = new WeakMap(), _PlayoutHandle_sampleRate = new WeakMap(), _PlayoutHandle_itemId = new WeakMap(), _PlayoutHandle_contentIndex = new WeakMap(), _PlayoutHandle_interrupted = new WeakMap();
|
|
73
|
+
export class AgentPlayout {
|
|
74
|
+
constructor(audioSource, sampleRate, numChannels, inFrameSize, outFrameSize) {
|
|
75
|
+
_AgentPlayout_instances.add(this);
|
|
76
|
+
_AgentPlayout_audioSource.set(this, void 0);
|
|
77
|
+
_AgentPlayout_playoutTask.set(this, void 0);
|
|
78
|
+
_AgentPlayout_sampleRate.set(this, void 0);
|
|
79
|
+
_AgentPlayout_numChannels.set(this, void 0);
|
|
80
|
+
_AgentPlayout_inFrameSize.set(this, void 0);
|
|
81
|
+
_AgentPlayout_outFrameSize.set(this, void 0);
|
|
82
|
+
__classPrivateFieldSet(this, _AgentPlayout_audioSource, audioSource, "f");
|
|
83
|
+
__classPrivateFieldSet(this, _AgentPlayout_playoutTask, null, "f");
|
|
84
|
+
__classPrivateFieldSet(this, _AgentPlayout_sampleRate, sampleRate, "f");
|
|
85
|
+
__classPrivateFieldSet(this, _AgentPlayout_numChannels, numChannels, "f");
|
|
86
|
+
__classPrivateFieldSet(this, _AgentPlayout_inFrameSize, inFrameSize, "f");
|
|
87
|
+
__classPrivateFieldSet(this, _AgentPlayout_outFrameSize, outFrameSize, "f");
|
|
88
|
+
}
|
|
89
|
+
play(itemId, contentIndex, transcriptionFwd, textStream, audioStream) {
|
|
90
|
+
const handle = new PlayoutHandle(__classPrivateFieldGet(this, _AgentPlayout_audioSource, "f"), __classPrivateFieldGet(this, _AgentPlayout_sampleRate, "f"), itemId, contentIndex, transcriptionFwd);
|
|
91
|
+
__classPrivateFieldSet(this, _AgentPlayout_playoutTask, __classPrivateFieldGet(this, _AgentPlayout_instances, "m", _AgentPlayout_makePlayoutTask).call(this, __classPrivateFieldGet(this, _AgentPlayout_playoutTask, "f"), handle, textStream, audioStream), "f");
|
|
92
|
+
return handle;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
_AgentPlayout_audioSource = new WeakMap(), _AgentPlayout_playoutTask = new WeakMap(), _AgentPlayout_sampleRate = new WeakMap(), _AgentPlayout_numChannels = new WeakMap(), _AgentPlayout_inFrameSize = new WeakMap(), _AgentPlayout_outFrameSize = new WeakMap(), _AgentPlayout_instances = new WeakSet(), _AgentPlayout_makePlayoutTask = function _AgentPlayout_makePlayoutTask(oldTask, handle, textStream, audioStream) {
|
|
96
|
+
return new CancellablePromise((resolve, reject, onCancel) => {
|
|
97
|
+
let cancelled = false;
|
|
98
|
+
onCancel(() => {
|
|
99
|
+
cancelled = true;
|
|
100
|
+
});
|
|
101
|
+
(async () => {
|
|
102
|
+
try {
|
|
103
|
+
if (oldTask) {
|
|
104
|
+
await gracefullyCancel(oldTask);
|
|
105
|
+
}
|
|
106
|
+
let firstFrame = true;
|
|
107
|
+
const readText = () => new CancellablePromise((resolveText, rejectText, onCancelText) => {
|
|
108
|
+
let cancelledText = false;
|
|
109
|
+
onCancelText(() => {
|
|
110
|
+
cancelledText = true;
|
|
111
|
+
});
|
|
112
|
+
(async () => {
|
|
113
|
+
var _a, e_1, _b, _c;
|
|
114
|
+
try {
|
|
115
|
+
try {
|
|
116
|
+
for (var _d = true, textStream_1 = __asyncValues(textStream), textStream_1_1; textStream_1_1 = await textStream_1.next(), _a = textStream_1_1.done, !_a; _d = true) {
|
|
117
|
+
_c = textStream_1_1.value;
|
|
118
|
+
_d = false;
|
|
119
|
+
const text = _c;
|
|
120
|
+
if (cancelledText || cancelled) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
handle.transcriptionFwd.pushText(text);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
127
|
+
finally {
|
|
128
|
+
try {
|
|
129
|
+
if (!_d && !_a && (_b = textStream_1.return)) await _b.call(textStream_1);
|
|
130
|
+
}
|
|
131
|
+
finally { if (e_1) throw e_1.error; }
|
|
132
|
+
}
|
|
133
|
+
resolveText();
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
rejectText(error);
|
|
137
|
+
}
|
|
138
|
+
})();
|
|
139
|
+
});
|
|
140
|
+
const capture = () => new CancellablePromise((resolveCapture, rejectCapture, onCancelCapture) => {
|
|
141
|
+
let cancelledCapture = false;
|
|
142
|
+
onCancelCapture(() => {
|
|
143
|
+
cancelledCapture = true;
|
|
144
|
+
});
|
|
145
|
+
(async () => {
|
|
146
|
+
var _a, e_2, _b, _c;
|
|
147
|
+
try {
|
|
148
|
+
const samplesPerChannel = __classPrivateFieldGet(this, _AgentPlayout_outFrameSize, "f");
|
|
149
|
+
const bstream = new AudioByteStream(__classPrivateFieldGet(this, _AgentPlayout_sampleRate, "f"), __classPrivateFieldGet(this, _AgentPlayout_numChannels, "f"), samplesPerChannel);
|
|
150
|
+
try {
|
|
151
|
+
for (var _d = true, audioStream_1 = __asyncValues(audioStream), audioStream_1_1; audioStream_1_1 = await audioStream_1.next(), _a = audioStream_1_1.done, !_a; _d = true) {
|
|
152
|
+
_c = audioStream_1_1.value;
|
|
153
|
+
_d = false;
|
|
154
|
+
const frame = _c;
|
|
155
|
+
if (cancelledCapture || cancelled) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
if (firstFrame) {
|
|
159
|
+
handle.transcriptionFwd.start();
|
|
160
|
+
firstFrame = false;
|
|
161
|
+
}
|
|
162
|
+
handle.transcriptionFwd.pushAudio(frame);
|
|
163
|
+
for (const f of bstream.write(frame.data.buffer)) {
|
|
164
|
+
handle.pushedDuration += f.samplesPerChannel / f.sampleRate;
|
|
165
|
+
await __classPrivateFieldGet(this, _AgentPlayout_audioSource, "f").captureFrame(f);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
170
|
+
finally {
|
|
171
|
+
try {
|
|
172
|
+
if (!_d && !_a && (_b = audioStream_1.return)) await _b.call(audioStream_1);
|
|
173
|
+
}
|
|
174
|
+
finally { if (e_2) throw e_2.error; }
|
|
175
|
+
}
|
|
176
|
+
if (!cancelledCapture && !cancelled) {
|
|
177
|
+
for (const f of bstream.flush()) {
|
|
178
|
+
handle.pushedDuration += f.samplesPerChannel / f.sampleRate;
|
|
179
|
+
await __classPrivateFieldGet(this, _AgentPlayout_audioSource, "f").captureFrame(f);
|
|
180
|
+
}
|
|
181
|
+
handle.transcriptionFwd.markAudioComplete();
|
|
182
|
+
await __classPrivateFieldGet(this, _AgentPlayout_audioSource, "f").waitForPlayout();
|
|
183
|
+
}
|
|
184
|
+
resolveCapture();
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
rejectCapture(error);
|
|
188
|
+
}
|
|
189
|
+
})();
|
|
190
|
+
});
|
|
191
|
+
const readTextTask = readText();
|
|
192
|
+
const captureTask = capture();
|
|
193
|
+
try {
|
|
194
|
+
await Promise.race([captureTask, handle.intFut.await]);
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
if (!captureTask.isCancelled) {
|
|
198
|
+
await gracefullyCancel(captureTask);
|
|
199
|
+
}
|
|
200
|
+
handle.totalPlayedTime = handle.pushedDuration - __classPrivateFieldGet(this, _AgentPlayout_audioSource, "f").queuedDuration;
|
|
201
|
+
if (handle.interrupted || captureTask.error) {
|
|
202
|
+
__classPrivateFieldGet(this, _AgentPlayout_audioSource, "f").clearQueue(); // make sure to remove any queued frames
|
|
203
|
+
}
|
|
204
|
+
if (!readTextTask.isCancelled) {
|
|
205
|
+
await gracefullyCancel(readTextTask);
|
|
206
|
+
}
|
|
207
|
+
if (!firstFrame && !handle.interrupted) {
|
|
208
|
+
handle.transcriptionFwd.markTextComplete();
|
|
209
|
+
}
|
|
210
|
+
handle.doneFut.resolve();
|
|
211
|
+
await handle.transcriptionFwd.close(handle.interrupted);
|
|
212
|
+
}
|
|
213
|
+
resolve();
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
reject(error);
|
|
217
|
+
}
|
|
218
|
+
})();
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=agent_playout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_playout.js","sourceRoot":"","sources":["../../src/multimodal/agent_playout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/multimodal/index.ts"],"names":[],"mappings":"AAGA,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/multimodal/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sCAAsC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { RemoteAudioTrack, RemoteParticipant, Room } from '@livekit/rtc-node';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
import type * as llm from '../llm/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
* @beta
|
|
8
|
+
*/
|
|
9
|
+
export declare abstract class RealtimeSession extends EventEmitter {
|
|
10
|
+
abstract defaultConversation: any;
|
|
11
|
+
abstract inputAudioBuffer: any;
|
|
12
|
+
abstract fncCtx: llm.FunctionContext | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
* @beta
|
|
17
|
+
*/
|
|
18
|
+
export declare abstract class RealtimeModel {
|
|
19
|
+
abstract session(options: any): RealtimeSession;
|
|
20
|
+
abstract close(): Promise<void>;
|
|
21
|
+
abstract sampleRate: number;
|
|
22
|
+
abstract numChannels: number;
|
|
23
|
+
abstract inFrameSize: number;
|
|
24
|
+
abstract outFrameSize: number;
|
|
25
|
+
}
|
|
26
|
+
export type AgentState = 'initializing' | 'thinking' | 'listening' | 'speaking';
|
|
27
|
+
export declare const AGENT_STATE_ATTRIBUTE = "lk.agent.state";
|
|
28
|
+
/** @beta */
|
|
29
|
+
export declare class MultimodalAgent {
|
|
30
|
+
#private;
|
|
31
|
+
model: RealtimeModel;
|
|
32
|
+
room: Room | null;
|
|
33
|
+
linkedParticipant: RemoteParticipant | null;
|
|
34
|
+
subscribedTrack: RemoteAudioTrack | null;
|
|
35
|
+
readMicroTask: {
|
|
36
|
+
promise: Promise<void>;
|
|
37
|
+
cancel: () => void;
|
|
38
|
+
} | null;
|
|
39
|
+
constructor({ model, fncCtx, }: {
|
|
40
|
+
model: RealtimeModel;
|
|
41
|
+
fncCtx?: llm.FunctionContext | undefined;
|
|
42
|
+
});
|
|
43
|
+
get fncCtx(): llm.FunctionContext | undefined;
|
|
44
|
+
set fncCtx(ctx: llm.FunctionContext | undefined);
|
|
45
|
+
start(room: Room, participant?: RemoteParticipant | string | null): Promise<RealtimeSession>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=multimodal_agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multimodal_agent.d.ts","sourceRoot":"","sources":["../../src/multimodal/multimodal_agent.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAEV,gBAAgB,EAChB,iBAAiB,EACjB,IAAI,EACL,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAM5C;;;GAGG;AACH,8BAAsB,eAAgB,SAAQ,YAAY;IAExD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAElC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;CAClD;AAED;;;GAGG;AACH,8BAAsB,aAAa;IAEjC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,eAAe;IAC/C,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAChF,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AAEtD,YAAY;AACZ,qBAAa,eAAe;;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAQ;IACzB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IACnD,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAChD,aAAa,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAAQ;gBAEhE,EACV,KAAK,EACL,MAAM,GACP,EAAE;QACD,KAAK,EAAE,aAAa,CAAC;QACrB,MAAM,CAAC,EAAE,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;KAC1C;IAmBD,IAAI,MAAM,IAAI,GAAG,CAAC,eAAe,GAAG,SAAS,CAE5C;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,eAAe,GAAG,SAAS,EAK9C;IA6BD,KAAK,CACH,IAAI,EAAE,IAAI,EACV,WAAW,GAAE,iBAAiB,GAAG,MAAM,GAAG,IAAW,GACpD,OAAO,CAAC,eAAe,CAAC;CA2S5B"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
13
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
14
|
+
var m = o[Symbol.asyncIterator], i;
|
|
15
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
16
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
17
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
18
|
+
};
|
|
19
|
+
var _MultimodalAgent_instances, _MultimodalAgent_participant, _MultimodalAgent_agentPublication, _MultimodalAgent_localTrackSid, _MultimodalAgent_localSource, _MultimodalAgent_agentPlayout, _MultimodalAgent_playingHandle, _MultimodalAgent_logger, _MultimodalAgent_session, _MultimodalAgent_fncCtx, _MultimodalAgent__started, _MultimodalAgent__pendingFunctionCalls, _MultimodalAgent__speaking, _MultimodalAgent_pendingFunctionCalls_get, _MultimodalAgent_pendingFunctionCalls_set, _MultimodalAgent_speaking_get, _MultimodalAgent_speaking_set, _MultimodalAgent_started_get, _MultimodalAgent_started_set, _MultimodalAgent_linkParticipant, _MultimodalAgent_subscribeToMicrophone, _MultimodalAgent_getLocalTrackSid, _MultimodalAgent_publishTranscription, _MultimodalAgent_updateState, _MultimodalAgent_setState;
|
|
20
|
+
import { AudioSource, AudioStream, LocalAudioTrack, RoomEvent, TrackPublishOptions, TrackSource, } from '@livekit/rtc-node';
|
|
21
|
+
import { EventEmitter } from 'events';
|
|
22
|
+
import { AudioByteStream } from '../audio.js';
|
|
23
|
+
import { log } from '../log.js';
|
|
24
|
+
import { BasicTranscriptionForwarder } from '../transcription.js';
|
|
25
|
+
import { findMicroTrackId } from '../utils.js';
|
|
26
|
+
import { AgentPlayout } from './agent_playout.js';
|
|
27
|
+
/**
|
|
28
|
+
* @internal
|
|
29
|
+
* @beta
|
|
30
|
+
*/
|
|
31
|
+
export class RealtimeSession extends EventEmitter {
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* @internal
|
|
35
|
+
* @beta
|
|
36
|
+
*/
|
|
37
|
+
export class RealtimeModel {
|
|
38
|
+
}
|
|
39
|
+
export const AGENT_STATE_ATTRIBUTE = 'lk.agent.state';
|
|
40
|
+
/** @beta */
|
|
41
|
+
export class MultimodalAgent {
|
|
42
|
+
constructor({ model, fncCtx, }) {
|
|
43
|
+
_MultimodalAgent_instances.add(this);
|
|
44
|
+
this.room = null;
|
|
45
|
+
this.linkedParticipant = null;
|
|
46
|
+
this.subscribedTrack = null;
|
|
47
|
+
this.readMicroTask = null;
|
|
48
|
+
_MultimodalAgent_participant.set(this, null);
|
|
49
|
+
_MultimodalAgent_agentPublication.set(this, null);
|
|
50
|
+
_MultimodalAgent_localTrackSid.set(this, null);
|
|
51
|
+
_MultimodalAgent_localSource.set(this, null);
|
|
52
|
+
_MultimodalAgent_agentPlayout.set(this, null);
|
|
53
|
+
_MultimodalAgent_playingHandle.set(this, undefined);
|
|
54
|
+
_MultimodalAgent_logger.set(this, log());
|
|
55
|
+
_MultimodalAgent_session.set(this, null);
|
|
56
|
+
_MultimodalAgent_fncCtx.set(this, undefined);
|
|
57
|
+
_MultimodalAgent__started.set(this, false);
|
|
58
|
+
_MultimodalAgent__pendingFunctionCalls.set(this, new Set());
|
|
59
|
+
_MultimodalAgent__speaking.set(this, false);
|
|
60
|
+
this.model = model;
|
|
61
|
+
__classPrivateFieldSet(this, _MultimodalAgent_fncCtx, fncCtx, "f");
|
|
62
|
+
}
|
|
63
|
+
get fncCtx() {
|
|
64
|
+
return __classPrivateFieldGet(this, _MultimodalAgent_fncCtx, "f");
|
|
65
|
+
}
|
|
66
|
+
set fncCtx(ctx) {
|
|
67
|
+
__classPrivateFieldSet(this, _MultimodalAgent_fncCtx, ctx, "f");
|
|
68
|
+
if (__classPrivateFieldGet(this, _MultimodalAgent_session, "f")) {
|
|
69
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").fncCtx = ctx;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
start(room, participant = null) {
|
|
73
|
+
return new Promise(async (resolve, reject) => {
|
|
74
|
+
var _a;
|
|
75
|
+
if (__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_started_get)) {
|
|
76
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").warn('MultimodalAgent already started');
|
|
77
|
+
resolve(__classPrivateFieldGet(this, _MultimodalAgent_session, "f")); // TODO: throw error?
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
81
|
+
room.on(RoomEvent.ParticipantConnected, (participant) => {
|
|
82
|
+
if (!this.linkedParticipant) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_linkParticipant).call(this, participant.identity);
|
|
86
|
+
});
|
|
87
|
+
this.room = room;
|
|
88
|
+
__classPrivateFieldSet(this, _MultimodalAgent_participant, participant, "f");
|
|
89
|
+
__classPrivateFieldSet(this, _MultimodalAgent_localSource, new AudioSource(this.model.sampleRate, this.model.numChannels), "f");
|
|
90
|
+
__classPrivateFieldSet(this, _MultimodalAgent_agentPlayout, new AgentPlayout(__classPrivateFieldGet(this, _MultimodalAgent_localSource, "f"), this.model.sampleRate, this.model.numChannels, this.model.inFrameSize, this.model.outFrameSize), "f");
|
|
91
|
+
const track = LocalAudioTrack.createAudioTrack('assistant_voice', __classPrivateFieldGet(this, _MultimodalAgent_localSource, "f"));
|
|
92
|
+
const options = new TrackPublishOptions();
|
|
93
|
+
options.source = TrackSource.SOURCE_MICROPHONE;
|
|
94
|
+
__classPrivateFieldSet(this, _MultimodalAgent_agentPublication, (await ((_a = room.localParticipant) === null || _a === void 0 ? void 0 : _a.publishTrack(track, options))) || null, "f");
|
|
95
|
+
if (!__classPrivateFieldGet(this, _MultimodalAgent_agentPublication, "f")) {
|
|
96
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error('Failed to publish track');
|
|
97
|
+
reject(new Error('Failed to publish track'));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
await __classPrivateFieldGet(this, _MultimodalAgent_agentPublication, "f").waitForSubscription();
|
|
101
|
+
if (participant) {
|
|
102
|
+
if (typeof participant === 'string') {
|
|
103
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_linkParticipant).call(this, participant);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_linkParticipant).call(this, participant.identity);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// No participant specified, try to find the first participant in the room
|
|
111
|
+
for (const participant of room.remoteParticipants.values()) {
|
|
112
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_linkParticipant).call(this, participant.identity);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
__classPrivateFieldSet(this, _MultimodalAgent_session, this.model.session({ fncCtx: __classPrivateFieldGet(this, _MultimodalAgent_fncCtx, "f") }), "f");
|
|
117
|
+
__classPrivateFieldSet(this, _MultimodalAgent_instances, true, "a", _MultimodalAgent_started_set);
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('response_content_added', (message) => {
|
|
120
|
+
var _a;
|
|
121
|
+
// openai.realtime.RealtimeContent
|
|
122
|
+
const trFwd = new BasicTranscriptionForwarder(this.room, this.room.localParticipant.identity, __classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_getLocalTrackSid).call(this), message.responseId);
|
|
123
|
+
const handle = (_a = __classPrivateFieldGet(this, _MultimodalAgent_agentPlayout, "f")) === null || _a === void 0 ? void 0 : _a.play(message.itemId, message.contentIndex, trFwd, message.textStream, message.audioStream);
|
|
124
|
+
if (handle) {
|
|
125
|
+
__classPrivateFieldSet(this, _MultimodalAgent_instances, true, "a", _MultimodalAgent_speaking_set);
|
|
126
|
+
handle.on('done', () => {
|
|
127
|
+
if (__classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f") == handle) {
|
|
128
|
+
__classPrivateFieldSet(this, _MultimodalAgent_instances, false, "a", _MultimodalAgent_speaking_set);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
__classPrivateFieldSet(this, _MultimodalAgent_playingHandle, handle, "f");
|
|
133
|
+
});
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
135
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('input_speech_committed', (ev) => {
|
|
136
|
+
var _a, _b;
|
|
137
|
+
// openai.realtime.InputSpeechCommittedEvent
|
|
138
|
+
const participantIdentity = (_a = this.linkedParticipant) === null || _a === void 0 ? void 0 : _a.identity;
|
|
139
|
+
const trackSid = (_b = this.subscribedTrack) === null || _b === void 0 ? void 0 : _b.sid;
|
|
140
|
+
if (participantIdentity && trackSid) {
|
|
141
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_publishTranscription).call(this, participantIdentity, trackSid, '…', false, ev.itemId);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error('Participant or track not set');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
148
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('input_speech_transcription_completed', (ev) => {
|
|
149
|
+
var _a, _b;
|
|
150
|
+
// openai.realtime.InputSpeechTranscriptionCompletedEvent
|
|
151
|
+
const transcription = ev.transcript;
|
|
152
|
+
const participantIdentity = (_a = this.linkedParticipant) === null || _a === void 0 ? void 0 : _a.identity;
|
|
153
|
+
const trackSid = (_b = this.subscribedTrack) === null || _b === void 0 ? void 0 : _b.sid;
|
|
154
|
+
if (participantIdentity && trackSid) {
|
|
155
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_publishTranscription).call(this, participantIdentity, trackSid, transcription, true, ev.itemId);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error('Participant or track not set');
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('input_speech_started', (ev) => {
|
|
162
|
+
var _a, _b;
|
|
163
|
+
if (__classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f") && !__classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f").done) {
|
|
164
|
+
__classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f").interrupt();
|
|
165
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").defaultConversation.item.truncate(__classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f").itemId, __classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f").contentIndex, Math.floor((__classPrivateFieldGet(this, _MultimodalAgent_playingHandle, "f").audioSamples / 24000) * 1000));
|
|
166
|
+
__classPrivateFieldSet(this, _MultimodalAgent_playingHandle, undefined, "f");
|
|
167
|
+
}
|
|
168
|
+
const participantIdentity = (_a = this.linkedParticipant) === null || _a === void 0 ? void 0 : _a.identity;
|
|
169
|
+
const trackSid = (_b = this.subscribedTrack) === null || _b === void 0 ? void 0 : _b.sid;
|
|
170
|
+
if (participantIdentity && trackSid) {
|
|
171
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_publishTranscription).call(this, participantIdentity, trackSid, '…', false, ev.itemId);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
175
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('function_call_started', (ev) => {
|
|
176
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_pendingFunctionCalls_get).add(ev.callId);
|
|
177
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
178
|
+
});
|
|
179
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
180
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('function_call_completed', (ev) => {
|
|
181
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_pendingFunctionCalls_get).delete(ev.callId);
|
|
182
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
183
|
+
});
|
|
184
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
185
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").on('function_call_failed', (ev) => {
|
|
186
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_pendingFunctionCalls_get).delete(ev.callId);
|
|
187
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
188
|
+
});
|
|
189
|
+
resolve(__classPrivateFieldGet(this, _MultimodalAgent_session, "f"));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
_MultimodalAgent_participant = new WeakMap(), _MultimodalAgent_agentPublication = new WeakMap(), _MultimodalAgent_localTrackSid = new WeakMap(), _MultimodalAgent_localSource = new WeakMap(), _MultimodalAgent_agentPlayout = new WeakMap(), _MultimodalAgent_playingHandle = new WeakMap(), _MultimodalAgent_logger = new WeakMap(), _MultimodalAgent_session = new WeakMap(), _MultimodalAgent_fncCtx = new WeakMap(), _MultimodalAgent__started = new WeakMap(), _MultimodalAgent__pendingFunctionCalls = new WeakMap(), _MultimodalAgent__speaking = new WeakMap(), _MultimodalAgent_instances = new WeakSet(), _MultimodalAgent_pendingFunctionCalls_get = function _MultimodalAgent_pendingFunctionCalls_get() {
|
|
194
|
+
return __classPrivateFieldGet(this, _MultimodalAgent__pendingFunctionCalls, "f");
|
|
195
|
+
}, _MultimodalAgent_pendingFunctionCalls_set = function _MultimodalAgent_pendingFunctionCalls_set(calls) {
|
|
196
|
+
__classPrivateFieldSet(this, _MultimodalAgent__pendingFunctionCalls, calls, "f");
|
|
197
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
198
|
+
}, _MultimodalAgent_speaking_get = function _MultimodalAgent_speaking_get() {
|
|
199
|
+
return __classPrivateFieldGet(this, _MultimodalAgent__speaking, "f");
|
|
200
|
+
}, _MultimodalAgent_speaking_set = function _MultimodalAgent_speaking_set(isSpeaking) {
|
|
201
|
+
__classPrivateFieldSet(this, _MultimodalAgent__speaking, isSpeaking, "f");
|
|
202
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
203
|
+
}, _MultimodalAgent_started_get = function _MultimodalAgent_started_get() {
|
|
204
|
+
return __classPrivateFieldGet(this, _MultimodalAgent__started, "f");
|
|
205
|
+
}, _MultimodalAgent_started_set = function _MultimodalAgent_started_set(started) {
|
|
206
|
+
__classPrivateFieldSet(this, _MultimodalAgent__started, started, "f");
|
|
207
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_updateState).call(this);
|
|
208
|
+
}, _MultimodalAgent_linkParticipant = function _MultimodalAgent_linkParticipant(participantIdentity) {
|
|
209
|
+
if (!this.room) {
|
|
210
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error('Room is not set');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.linkedParticipant = this.room.remoteParticipants.get(participantIdentity) || null;
|
|
214
|
+
if (!this.linkedParticipant) {
|
|
215
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error(`Participant with identity ${participantIdentity} not found`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (this.linkedParticipant.trackPublications.size > 0) {
|
|
219
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_subscribeToMicrophone).call(this);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
this.room.on(RoomEvent.TrackPublished, () => {
|
|
223
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_subscribeToMicrophone).call(this);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}, _MultimodalAgent_subscribeToMicrophone = function _MultimodalAgent_subscribeToMicrophone() {
|
|
227
|
+
const readAudioStreamTask = async (audioStream) => {
|
|
228
|
+
var _a, e_1, _b, _c;
|
|
229
|
+
const bstream = new AudioByteStream(this.model.sampleRate, this.model.numChannels, this.model.inFrameSize);
|
|
230
|
+
try {
|
|
231
|
+
for (var _d = true, audioStream_1 = __asyncValues(audioStream), audioStream_1_1; audioStream_1_1 = await audioStream_1.next(), _a = audioStream_1_1.done, !_a; _d = true) {
|
|
232
|
+
_c = audioStream_1_1.value;
|
|
233
|
+
_d = false;
|
|
234
|
+
const frame = _c;
|
|
235
|
+
const audioData = frame.data;
|
|
236
|
+
for (const frame of bstream.write(audioData.buffer)) {
|
|
237
|
+
__classPrivateFieldGet(this, _MultimodalAgent_session, "f").inputAudioBuffer.append(frame);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
242
|
+
finally {
|
|
243
|
+
try {
|
|
244
|
+
if (!_d && !_a && (_b = audioStream_1.return)) await _b.call(audioStream_1);
|
|
245
|
+
}
|
|
246
|
+
finally { if (e_1) throw e_1.error; }
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
if (!this.linkedParticipant) {
|
|
250
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error('Participant is not set');
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
for (const publication of this.linkedParticipant.trackPublications.values()) {
|
|
254
|
+
if (publication.source !== TrackSource.SOURCE_MICROPHONE) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (!publication.subscribed) {
|
|
258
|
+
publication.setSubscribed(true);
|
|
259
|
+
}
|
|
260
|
+
const track = publication.track;
|
|
261
|
+
if (track && track !== this.subscribedTrack) {
|
|
262
|
+
this.subscribedTrack = track;
|
|
263
|
+
if (this.readMicroTask) {
|
|
264
|
+
this.readMicroTask.cancel();
|
|
265
|
+
}
|
|
266
|
+
let cancel;
|
|
267
|
+
this.readMicroTask = {
|
|
268
|
+
promise: new Promise((resolve, reject) => {
|
|
269
|
+
cancel = () => {
|
|
270
|
+
reject(new Error('Task cancelled'));
|
|
271
|
+
};
|
|
272
|
+
readAudioStreamTask(new AudioStream(track, this.model.sampleRate, this.model.numChannels))
|
|
273
|
+
.then(resolve)
|
|
274
|
+
.catch(reject);
|
|
275
|
+
}),
|
|
276
|
+
cancel: () => cancel(),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}, _MultimodalAgent_getLocalTrackSid = function _MultimodalAgent_getLocalTrackSid() {
|
|
281
|
+
var _a;
|
|
282
|
+
if (!__classPrivateFieldGet(this, _MultimodalAgent_localTrackSid, "f") && this.room && this.room.localParticipant) {
|
|
283
|
+
__classPrivateFieldSet(this, _MultimodalAgent_localTrackSid, findMicroTrackId(this.room, (_a = this.room.localParticipant) === null || _a === void 0 ? void 0 : _a.identity), "f");
|
|
284
|
+
}
|
|
285
|
+
return __classPrivateFieldGet(this, _MultimodalAgent_localTrackSid, "f");
|
|
286
|
+
}, _MultimodalAgent_publishTranscription = function _MultimodalAgent_publishTranscription(participantIdentity, trackSid, text, isFinal, id) {
|
|
287
|
+
var _a;
|
|
288
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").debug(`Publishing transcription ${participantIdentity} ${trackSid} ${text} ${isFinal} ${id}`);
|
|
289
|
+
if (!((_a = this.room) === null || _a === void 0 ? void 0 : _a.localParticipant)) {
|
|
290
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").error('Room or local participant not set');
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
this.room.localParticipant.publishTranscription({
|
|
294
|
+
participantIdentity,
|
|
295
|
+
trackSid,
|
|
296
|
+
segments: [
|
|
297
|
+
{
|
|
298
|
+
text,
|
|
299
|
+
final: isFinal,
|
|
300
|
+
id,
|
|
301
|
+
startTime: BigInt(0),
|
|
302
|
+
endTime: BigInt(0),
|
|
303
|
+
language: '',
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
});
|
|
307
|
+
}, _MultimodalAgent_updateState = function _MultimodalAgent_updateState() {
|
|
308
|
+
let newState = 'initializing';
|
|
309
|
+
if (__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_pendingFunctionCalls_get).size > 0) {
|
|
310
|
+
newState = 'thinking';
|
|
311
|
+
}
|
|
312
|
+
else if (__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_speaking_get)) {
|
|
313
|
+
newState = 'speaking';
|
|
314
|
+
}
|
|
315
|
+
else if (__classPrivateFieldGet(this, _MultimodalAgent_instances, "a", _MultimodalAgent_started_get)) {
|
|
316
|
+
newState = 'listening';
|
|
317
|
+
}
|
|
318
|
+
__classPrivateFieldGet(this, _MultimodalAgent_instances, "m", _MultimodalAgent_setState).call(this, newState);
|
|
319
|
+
}, _MultimodalAgent_setState = function _MultimodalAgent_setState(state) {
|
|
320
|
+
var _a;
|
|
321
|
+
if (((_a = this.room) === null || _a === void 0 ? void 0 : _a.isConnected) && this.room.localParticipant) {
|
|
322
|
+
const currentState = this.room.localParticipant.attributes[AGENT_STATE_ATTRIBUTE];
|
|
323
|
+
if (currentState !== state) {
|
|
324
|
+
this.room.localParticipant.setAttributes({
|
|
325
|
+
[AGENT_STATE_ATTRIBUTE]: state,
|
|
326
|
+
});
|
|
327
|
+
__classPrivateFieldGet(this, _MultimodalAgent_logger, "f").debug(`${AGENT_STATE_ATTRIBUTE}: ${currentState} ->${state}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=multimodal_agent.js.map
|