@livekit/agents 1.0.45 → 1.0.47
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/cli.cjs +14 -20
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -20
- package/dist/cli.js.map +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs +14 -5
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/job_proc_lazy_main.js +14 -5
- package/dist/ipc/job_proc_lazy_main.js.map +1 -1
- package/dist/llm/chat_context.cjs +19 -0
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +4 -0
- package/dist/llm/chat_context.d.ts +4 -0
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +19 -0
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/provider_format/index.cjs +2 -0
- package/dist/llm/provider_format/index.cjs.map +1 -1
- package/dist/llm/provider_format/index.d.cts +1 -1
- package/dist/llm/provider_format/index.d.ts +1 -1
- package/dist/llm/provider_format/index.d.ts.map +1 -1
- package/dist/llm/provider_format/index.js +6 -1
- package/dist/llm/provider_format/index.js.map +1 -1
- package/dist/llm/provider_format/openai.cjs +82 -2
- package/dist/llm/provider_format/openai.cjs.map +1 -1
- package/dist/llm/provider_format/openai.d.cts +1 -0
- package/dist/llm/provider_format/openai.d.ts +1 -0
- package/dist/llm/provider_format/openai.d.ts.map +1 -1
- package/dist/llm/provider_format/openai.js +80 -1
- package/dist/llm/provider_format/openai.js.map +1 -1
- package/dist/llm/provider_format/openai.test.cjs +326 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -1
- package/dist/llm/provider_format/openai.test.js +327 -1
- package/dist/llm/provider_format/openai.test.js.map +1 -1
- package/dist/llm/provider_format/utils.cjs +4 -3
- package/dist/llm/provider_format/utils.cjs.map +1 -1
- package/dist/llm/provider_format/utils.d.ts.map +1 -1
- package/dist/llm/provider_format/utils.js +4 -3
- package/dist/llm/provider_format/utils.js.map +1 -1
- package/dist/llm/realtime.cjs.map +1 -1
- package/dist/llm/realtime.d.cts +1 -0
- package/dist/llm/realtime.d.ts +1 -0
- package/dist/llm/realtime.d.ts.map +1 -1
- package/dist/llm/realtime.js.map +1 -1
- package/dist/log.cjs +5 -2
- package/dist/log.cjs.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +5 -2
- package/dist/log.js.map +1 -1
- package/dist/stream/deferred_stream.cjs +15 -6
- package/dist/stream/deferred_stream.cjs.map +1 -1
- package/dist/stream/deferred_stream.d.ts.map +1 -1
- package/dist/stream/deferred_stream.js +15 -6
- package/dist/stream/deferred_stream.js.map +1 -1
- package/dist/stream/index.cjs +3 -0
- package/dist/stream/index.cjs.map +1 -1
- package/dist/stream/index.d.cts +1 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -1
- package/dist/stream/multi_input_stream.cjs +139 -0
- package/dist/stream/multi_input_stream.cjs.map +1 -0
- package/dist/stream/multi_input_stream.d.cts +55 -0
- package/dist/stream/multi_input_stream.d.ts +55 -0
- package/dist/stream/multi_input_stream.d.ts.map +1 -0
- package/dist/stream/multi_input_stream.js +115 -0
- package/dist/stream/multi_input_stream.js.map +1 -0
- package/dist/stream/multi_input_stream.test.cjs +340 -0
- package/dist/stream/multi_input_stream.test.cjs.map +1 -0
- package/dist/stream/multi_input_stream.test.js +339 -0
- package/dist/stream/multi_input_stream.test.js.map +1 -0
- package/dist/telemetry/trace_types.cjs +42 -0
- package/dist/telemetry/trace_types.cjs.map +1 -1
- package/dist/telemetry/trace_types.d.cts +14 -0
- package/dist/telemetry/trace_types.d.ts +14 -0
- package/dist/telemetry/trace_types.d.ts.map +1 -1
- package/dist/telemetry/trace_types.js +28 -0
- package/dist/telemetry/trace_types.js.map +1 -1
- package/dist/utils.cjs +44 -2
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +8 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +44 -2
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +71 -0
- package/dist/utils.test.cjs.map +1 -1
- package/dist/utils.test.js +71 -0
- package/dist/utils.test.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/agent.cjs +144 -12
- package/dist/voice/agent.cjs.map +1 -1
- package/dist/voice/agent.d.cts +29 -4
- package/dist/voice/agent.d.ts +29 -4
- package/dist/voice/agent.d.ts.map +1 -1
- package/dist/voice/agent.js +140 -11
- package/dist/voice/agent.js.map +1 -1
- package/dist/voice/agent.test.cjs +120 -0
- package/dist/voice/agent.test.cjs.map +1 -1
- package/dist/voice/agent.test.js +122 -2
- package/dist/voice/agent.test.js.map +1 -1
- package/dist/voice/agent_activity.cjs +402 -292
- package/dist/voice/agent_activity.cjs.map +1 -1
- package/dist/voice/agent_activity.d.cts +35 -7
- package/dist/voice/agent_activity.d.ts +35 -7
- package/dist/voice/agent_activity.d.ts.map +1 -1
- package/dist/voice/agent_activity.js +402 -287
- package/dist/voice/agent_activity.js.map +1 -1
- package/dist/voice/agent_session.cjs +156 -44
- package/dist/voice/agent_session.cjs.map +1 -1
- package/dist/voice/agent_session.d.cts +22 -9
- package/dist/voice/agent_session.d.ts +22 -9
- package/dist/voice/agent_session.d.ts.map +1 -1
- package/dist/voice/agent_session.js +156 -44
- package/dist/voice/agent_session.js.map +1 -1
- package/dist/voice/audio_recognition.cjs +89 -36
- package/dist/voice/audio_recognition.cjs.map +1 -1
- package/dist/voice/audio_recognition.d.cts +22 -1
- package/dist/voice/audio_recognition.d.ts +22 -1
- package/dist/voice/audio_recognition.d.ts.map +1 -1
- package/dist/voice/audio_recognition.js +93 -36
- package/dist/voice/audio_recognition.js.map +1 -1
- package/dist/voice/audio_recognition_span.test.cjs +233 -0
- package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
- package/dist/voice/audio_recognition_span.test.js +232 -0
- package/dist/voice/audio_recognition_span.test.js.map +1 -0
- package/dist/voice/generation.cjs +39 -19
- package/dist/voice/generation.cjs.map +1 -1
- package/dist/voice/generation.d.ts.map +1 -1
- package/dist/voice/generation.js +44 -20
- package/dist/voice/generation.js.map +1 -1
- package/dist/voice/index.cjs +2 -0
- package/dist/voice/index.cjs.map +1 -1
- package/dist/voice/index.d.cts +1 -1
- package/dist/voice/index.d.ts +1 -1
- package/dist/voice/index.d.ts.map +1 -1
- package/dist/voice/index.js +2 -1
- package/dist/voice/index.js.map +1 -1
- package/dist/voice/io.cjs +6 -3
- package/dist/voice/io.cjs.map +1 -1
- package/dist/voice/io.d.cts +3 -2
- package/dist/voice/io.d.ts +3 -2
- package/dist/voice/io.d.ts.map +1 -1
- package/dist/voice/io.js +6 -3
- package/dist/voice/io.js.map +1 -1
- package/dist/voice/recorder_io/recorder_io.cjs +3 -1
- package/dist/voice/recorder_io/recorder_io.cjs.map +1 -1
- package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -1
- package/dist/voice/recorder_io/recorder_io.js +3 -1
- package/dist/voice/recorder_io/recorder_io.js.map +1 -1
- package/dist/voice/room_io/_input.cjs +17 -17
- package/dist/voice/room_io/_input.cjs.map +1 -1
- package/dist/voice/room_io/_input.d.cts +2 -2
- package/dist/voice/room_io/_input.d.ts +2 -2
- package/dist/voice/room_io/_input.d.ts.map +1 -1
- package/dist/voice/room_io/_input.js +7 -6
- package/dist/voice/room_io/_input.js.map +1 -1
- package/dist/voice/room_io/room_io.cjs +9 -0
- package/dist/voice/room_io/room_io.cjs.map +1 -1
- package/dist/voice/room_io/room_io.d.cts +3 -1
- package/dist/voice/room_io/room_io.d.ts +3 -1
- package/dist/voice/room_io/room_io.d.ts.map +1 -1
- package/dist/voice/room_io/room_io.js +9 -0
- package/dist/voice/room_io/room_io.js.map +1 -1
- package/dist/voice/speech_handle.cjs +7 -1
- package/dist/voice/speech_handle.cjs.map +1 -1
- package/dist/voice/speech_handle.d.cts +2 -0
- package/dist/voice/speech_handle.d.ts +2 -0
- package/dist/voice/speech_handle.d.ts.map +1 -1
- package/dist/voice/speech_handle.js +8 -2
- package/dist/voice/speech_handle.js.map +1 -1
- package/dist/voice/testing/run_result.cjs +66 -15
- package/dist/voice/testing/run_result.cjs.map +1 -1
- package/dist/voice/testing/run_result.d.cts +14 -3
- package/dist/voice/testing/run_result.d.ts +14 -3
- package/dist/voice/testing/run_result.d.ts.map +1 -1
- package/dist/voice/testing/run_result.js +66 -15
- package/dist/voice/testing/run_result.js.map +1 -1
- package/dist/voice/utils.cjs +47 -0
- package/dist/voice/utils.cjs.map +1 -0
- package/dist/voice/utils.d.cts +4 -0
- package/dist/voice/utils.d.ts +4 -0
- package/dist/voice/utils.d.ts.map +1 -0
- package/dist/voice/utils.js +23 -0
- package/dist/voice/utils.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +20 -33
- package/src/ipc/job_proc_lazy_main.ts +16 -5
- package/src/llm/chat_context.ts +35 -0
- package/src/llm/provider_format/index.ts +7 -2
- package/src/llm/provider_format/openai.test.ts +385 -1
- package/src/llm/provider_format/openai.ts +103 -0
- package/src/llm/provider_format/utils.ts +6 -4
- package/src/llm/realtime.ts +1 -0
- package/src/log.ts +5 -2
- package/src/stream/deferred_stream.ts +17 -6
- package/src/stream/index.ts +1 -0
- package/src/stream/multi_input_stream.test.ts +540 -0
- package/src/stream/multi_input_stream.ts +172 -0
- package/src/telemetry/trace_types.ts +18 -0
- package/src/utils.test.ts +87 -0
- package/src/utils.ts +52 -2
- package/src/version.ts +1 -1
- package/src/voice/agent.test.ts +140 -2
- package/src/voice/agent.ts +189 -10
- package/src/voice/agent_activity.ts +449 -286
- package/src/voice/agent_session.ts +195 -51
- package/src/voice/audio_recognition.ts +118 -38
- package/src/voice/audio_recognition_span.test.ts +261 -0
- package/src/voice/generation.ts +52 -23
- package/src/voice/index.ts +1 -1
- package/src/voice/io.ts +7 -4
- package/src/voice/recorder_io/recorder_io.ts +2 -1
- package/src/voice/room_io/_input.ts +11 -7
- package/src/voice/room_io/room_io.ts +12 -0
- package/src/voice/speech_handle.ts +9 -2
- package/src/voice/testing/run_result.ts +81 -23
- package/src/voice/utils.ts +29 -0
|
@@ -30,6 +30,8 @@ import {
|
|
|
30
30
|
// Type for agent constructor (used in assertions)
|
|
31
31
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
32
|
type AgentConstructor = new (...args: any[]) => Agent;
|
|
33
|
+
// In JS we use a zod schema so runtime validation and TS generic inference stay aligned.
|
|
34
|
+
type OutputSchema<T> = z.ZodType<T>;
|
|
33
35
|
|
|
34
36
|
// Environment variable for verbose output
|
|
35
37
|
const evalsVerbose = parseInt(process.env.LIVEKIT_EVALS_VERBOSE || '0', 10);
|
|
@@ -48,19 +50,21 @@ export class RunResult<T = unknown> {
|
|
|
48
50
|
private _events: RunEvent[] = [];
|
|
49
51
|
private doneFut = new Future<void>();
|
|
50
52
|
private userInput?: string;
|
|
53
|
+
private outputType?: OutputSchema<T>;
|
|
54
|
+
private finalOutputValue?: T;
|
|
55
|
+
private hasFinalOutput = false;
|
|
51
56
|
|
|
52
57
|
private handles: Set<SpeechHandle | Task<void>> = new Set();
|
|
53
58
|
private lastSpeechHandle?: SpeechHandle;
|
|
54
59
|
private runAssert?: RunAssert;
|
|
60
|
+
// Store per-handle closures so _unwatchHandle can remove callbacks symmetrically.
|
|
61
|
+
private doneCallbacks = new Map<SpeechHandle | Task<void>, () => void>();
|
|
55
62
|
|
|
56
|
-
|
|
57
|
-
// - Add outputType?: new (...args: unknown[]) => T
|
|
58
|
-
// - Add finalOutput?: T
|
|
59
|
-
// - Implement markDone() to extract final_output from SpeechHandle.maybeRunFinalOutput
|
|
60
|
-
// - See Python: run_result.py lines 182-201
|
|
63
|
+
private readonly itemAddedCallback = (item: ChatItem) => this._itemAdded(item);
|
|
61
64
|
|
|
62
|
-
constructor(options?: { userInput?: string }) {
|
|
65
|
+
constructor(options?: { userInput?: string; outputType?: OutputSchema<T> }) {
|
|
63
66
|
this.userInput = options?.userInput;
|
|
67
|
+
this.outputType = options?.outputType;
|
|
64
68
|
}
|
|
65
69
|
|
|
66
70
|
/**
|
|
@@ -92,12 +96,17 @@ export class RunResult<T = unknown> {
|
|
|
92
96
|
|
|
93
97
|
/**
|
|
94
98
|
* Returns the final output of the run after completion.
|
|
95
|
-
*
|
|
96
|
-
* @throws Error - Not implemented yet.
|
|
97
99
|
*/
|
|
98
100
|
get finalOutput(): T {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
if (!this.doneFut.done) {
|
|
102
|
+
throw new Error('cannot retrieve finalOutput, RunResult is not done');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (!this.hasFinalOutput) {
|
|
106
|
+
throw new Error('no final output');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return this.finalOutputValue as T;
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
/**
|
|
@@ -167,15 +176,18 @@ export class RunResult<T = unknown> {
|
|
|
167
176
|
* Watch a speech handle or task for completion.
|
|
168
177
|
*/
|
|
169
178
|
_watchHandle(handle: SpeechHandle | Task<void>): void {
|
|
179
|
+
if (this.handles.has(handle)) return;
|
|
180
|
+
|
|
170
181
|
this.handles.add(handle);
|
|
171
182
|
|
|
172
183
|
if (isSpeechHandle(handle)) {
|
|
173
|
-
handle._addItemAddedCallback(this.
|
|
184
|
+
handle._addItemAddedCallback(this.itemAddedCallback);
|
|
174
185
|
}
|
|
175
186
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
187
|
+
const doneCallback = () => this._markDoneIfNeeded(handle);
|
|
188
|
+
|
|
189
|
+
this.doneCallbacks.set(handle, doneCallback);
|
|
190
|
+
handle.addDoneCallback(doneCallback);
|
|
179
191
|
}
|
|
180
192
|
|
|
181
193
|
/**
|
|
@@ -184,31 +196,77 @@ export class RunResult<T = unknown> {
|
|
|
184
196
|
*/
|
|
185
197
|
_unwatchHandle(handle: SpeechHandle | Task<void>): void {
|
|
186
198
|
this.handles.delete(handle);
|
|
199
|
+
const doneCallback = this.doneCallbacks.get(handle);
|
|
200
|
+
|
|
201
|
+
if (doneCallback) {
|
|
202
|
+
handle.removeDoneCallback(doneCallback);
|
|
203
|
+
this.doneCallbacks.delete(handle);
|
|
204
|
+
}
|
|
187
205
|
|
|
188
206
|
if (isSpeechHandle(handle)) {
|
|
189
|
-
handle._removeItemAddedCallback(this.
|
|
207
|
+
handle._removeItemAddedCallback(this.itemAddedCallback);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** @internal */
|
|
212
|
+
_watchedHandleCount(): number {
|
|
213
|
+
return this.handles.size;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** @internal – Reject the run with an error (e.g. when deferred generateReply fails). */
|
|
217
|
+
_reject(error: Error): void {
|
|
218
|
+
if (!this.doneFut.done) {
|
|
219
|
+
this.doneFut.reject(error);
|
|
190
220
|
}
|
|
191
221
|
}
|
|
192
222
|
|
|
193
|
-
|
|
223
|
+
/** @internal */
|
|
224
|
+
_markDoneIfNeeded(handle?: SpeechHandle | Task<void> | null): void {
|
|
194
225
|
if (isSpeechHandle(handle)) {
|
|
195
226
|
this.lastSpeechHandle = handle;
|
|
196
227
|
}
|
|
197
228
|
|
|
198
|
-
|
|
229
|
+
const allDone = [...this.handles].every((h) => (isSpeechHandle(h) ? h.done() : h.done));
|
|
230
|
+
if (allDone) {
|
|
199
231
|
this._markDone();
|
|
200
232
|
}
|
|
201
233
|
}
|
|
202
234
|
|
|
203
235
|
private _markDone(): void {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (!this.doneFut.done) {
|
|
236
|
+
if (this.doneFut.done) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (!this.lastSpeechHandle) {
|
|
210
241
|
this.doneFut.resolve();
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const finalOutput = this.lastSpeechHandle._maybeRunFinalOutput;
|
|
246
|
+
if (finalOutput instanceof Error) {
|
|
247
|
+
this.doneFut.reject(finalOutput);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (this.outputType) {
|
|
252
|
+
const result = this.outputType.safeParse(finalOutput);
|
|
253
|
+
if (!result.success) {
|
|
254
|
+
this.doneFut.reject(
|
|
255
|
+
new Error(`Expected output matching provided zod schema: ${result.error.message}`),
|
|
256
|
+
);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
this.finalOutputValue = result.data;
|
|
260
|
+
this.hasFinalOutput = true;
|
|
261
|
+
this.doneFut.resolve();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (finalOutput !== undefined) {
|
|
266
|
+
this.finalOutputValue = finalOutput as T;
|
|
267
|
+
this.hasFinalOutput = true;
|
|
211
268
|
}
|
|
269
|
+
this.doneFut.resolve();
|
|
212
270
|
}
|
|
213
271
|
|
|
214
272
|
/**
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2025 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import type { Participant, ParticipantKind } from '@livekit/rtc-node';
|
|
5
|
+
import type { Span } from '@opentelemetry/api';
|
|
6
|
+
import { traceTypes } from '../telemetry/index.js';
|
|
7
|
+
|
|
8
|
+
export function setParticipantSpanAttributes(
|
|
9
|
+
span: Span,
|
|
10
|
+
participant: Pick<Participant, 'sid' | 'identity' | 'kind'>,
|
|
11
|
+
): void {
|
|
12
|
+
if (participant.sid) {
|
|
13
|
+
span.setAttribute(traceTypes.ATTR_PARTICIPANT_ID, participant.sid);
|
|
14
|
+
}
|
|
15
|
+
span.setAttribute(traceTypes.ATTR_PARTICIPANT_IDENTITY, participant.identity);
|
|
16
|
+
span.setAttribute(traceTypes.ATTR_PARTICIPANT_KIND, participantKindName(participant.kind));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function participantKindName(kind: ParticipantKind): string {
|
|
20
|
+
const names: Record<number, string> = {
|
|
21
|
+
0: 'STANDARD',
|
|
22
|
+
1: 'INGRESS',
|
|
23
|
+
2: 'EGRESS',
|
|
24
|
+
3: 'SIP',
|
|
25
|
+
4: 'AGENT',
|
|
26
|
+
5: 'CONNECTOR',
|
|
27
|
+
};
|
|
28
|
+
return names[kind as number] ?? String(kind);
|
|
29
|
+
}
|