@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
|
@@ -3,6 +3,7 @@ import type { AudioFrame, Room } from '@livekit/rtc-node';
|
|
|
3
3
|
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
4
4
|
import type { Context } from '@opentelemetry/api';
|
|
5
5
|
import type { ReadableStream } from 'node:stream/web';
|
|
6
|
+
import type { z } from 'zod';
|
|
6
7
|
import { type LLMModels, type STTModelString, type TTSModelString } from '../inference/index.js';
|
|
7
8
|
import type { FunctionCall, FunctionCallOutput } from '../llm/chat_context.js';
|
|
8
9
|
import { ChatContext, ChatMessage } from '../llm/chat_context.js';
|
|
@@ -12,13 +13,14 @@ import type { STT } from '../stt/index.js';
|
|
|
12
13
|
import type { STTError } from '../stt/stt.js';
|
|
13
14
|
import type { TTS, TTSError } from '../tts/tts.js';
|
|
14
15
|
import { type ResolvedSessionConnectOptions, type SessionConnectOptions } from '../types.js';
|
|
16
|
+
import { Task } from '../utils.js';
|
|
15
17
|
import type { VAD } from '../vad.js';
|
|
16
18
|
import type { Agent } from './agent.js';
|
|
17
19
|
import type { _TurnDetector } from './audio_recognition.js';
|
|
18
20
|
import { type AgentEvent, AgentSessionEventTypes, type AgentState, type AgentStateChangedEvent, type CloseEvent, type ConversationItemAddedEvent, type ErrorEvent, type FunctionToolsExecutedEvent, type MetricsCollectedEvent, type ShutdownReason, type SpeechCreatedEvent, type UserInputTranscribedEvent, type UserState, type UserStateChangedEvent } from './events.js';
|
|
19
21
|
import { AgentInput, AgentOutput } from './io.js';
|
|
20
22
|
import { RecorderIO } from './recorder_io/index.js';
|
|
21
|
-
import { type RoomInputOptions, type RoomOutputOptions } from './room_io/index.js';
|
|
23
|
+
import { RoomIO, type RoomInputOptions, type RoomOutputOptions } from './room_io/index.js';
|
|
22
24
|
import type { UnknownUserData } from './run_context.js';
|
|
23
25
|
import type { SpeechHandle } from './speech_handle.js';
|
|
24
26
|
import { RunResult } from './testing/run_result.js';
|
|
@@ -56,6 +58,12 @@ export type AgentSessionOptions<UserData = UnknownUserData> = {
|
|
|
56
58
|
voiceOptions?: Partial<VoiceOptions>;
|
|
57
59
|
connOptions?: SessionConnectOptions;
|
|
58
60
|
};
|
|
61
|
+
type ActivityTransitionOptions = {
|
|
62
|
+
previousActivity?: 'close' | 'pause';
|
|
63
|
+
newActivity?: 'start' | 'resume';
|
|
64
|
+
blockedTasks?: Task<any>[];
|
|
65
|
+
waitOnEnter?: boolean;
|
|
66
|
+
};
|
|
59
67
|
declare const AgentSession_base: new () => TypedEmitter<AgentSessionCallbacks>;
|
|
60
68
|
export declare class AgentSession<UserData = UnknownUserData> extends AgentSession_base {
|
|
61
69
|
vad?: VAD;
|
|
@@ -67,9 +75,12 @@ export declare class AgentSession<UserData = UnknownUserData> extends AgentSessi
|
|
|
67
75
|
private agent?;
|
|
68
76
|
private activity?;
|
|
69
77
|
private nextActivity?;
|
|
78
|
+
private updateActivityTask?;
|
|
70
79
|
private started;
|
|
71
80
|
private userState;
|
|
72
|
-
private
|
|
81
|
+
private readonly activityLock;
|
|
82
|
+
/** @internal */
|
|
83
|
+
_roomIO?: RoomIO;
|
|
73
84
|
private logger;
|
|
74
85
|
private _chatCtx;
|
|
75
86
|
private _userData;
|
|
@@ -122,7 +133,9 @@ export declare class AgentSession<UserData = UnknownUserData> extends AgentSessi
|
|
|
122
133
|
allowInterruptions?: boolean;
|
|
123
134
|
addToChatCtx?: boolean;
|
|
124
135
|
}): SpeechHandle;
|
|
125
|
-
interrupt(
|
|
136
|
+
interrupt(options?: {
|
|
137
|
+
force?: boolean;
|
|
138
|
+
}): import("../utils.js").Future<void>;
|
|
126
139
|
generateReply(options?: {
|
|
127
140
|
userInput?: string;
|
|
128
141
|
instructions?: string;
|
|
@@ -142,15 +155,15 @@ export declare class AgentSession<UserData = UnknownUserData> extends AgentSessi
|
|
|
142
155
|
* result.expect.noMoreEvents();
|
|
143
156
|
* ```
|
|
144
157
|
*
|
|
145
|
-
* @param options - Run options including user input
|
|
158
|
+
* @param options - Run options including user input and optional output type
|
|
146
159
|
* @returns A RunResult that resolves when the agent finishes responding
|
|
147
|
-
*
|
|
148
|
-
* TODO: Add outputType parameter for typed outputs (parity with Python)
|
|
149
160
|
*/
|
|
150
|
-
run(
|
|
161
|
+
run<T = unknown>({ userInput, outputType, }: {
|
|
151
162
|
userInput: string;
|
|
152
|
-
|
|
153
|
-
|
|
163
|
+
outputType?: z.ZodType<T>;
|
|
164
|
+
}): RunResult<T>;
|
|
165
|
+
/** @internal */
|
|
166
|
+
_updateActivity(agent: Agent, options?: ActivityTransitionOptions): Promise<void>;
|
|
154
167
|
get chatCtx(): ChatContext;
|
|
155
168
|
get agentState(): AgentState;
|
|
156
169
|
get currentAgent(): Agent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_session.d.ts","sourceRoot":"","sources":["../../src/voice/agent_session.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"agent_session.d.ts","sourceRoot":"","sources":["../../src/voice/agent_session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Mutex } from "@livekit/mutex";
|
|
1
2
|
import { ROOT_CONTEXT, context as otelContext, trace } from "@opentelemetry/api";
|
|
2
3
|
import { EventEmitter } from "node:events";
|
|
3
4
|
import {
|
|
@@ -13,6 +14,7 @@ import {
|
|
|
13
14
|
DEFAULT_API_CONNECT_OPTIONS,
|
|
14
15
|
DEFAULT_SESSION_CONNECT_OPTIONS
|
|
15
16
|
} from "../types.js";
|
|
17
|
+
import { Task } from "../utils.js";
|
|
16
18
|
import { AgentActivity } from "./agent_activity.js";
|
|
17
19
|
import {
|
|
18
20
|
AgentSessionEventTypes,
|
|
@@ -26,6 +28,7 @@ import { AgentInput, AgentOutput } from "./io.js";
|
|
|
26
28
|
import { RecorderIO } from "./recorder_io/index.js";
|
|
27
29
|
import { RoomIO } from "./room_io/index.js";
|
|
28
30
|
import { RunResult } from "./testing/run_result.js";
|
|
31
|
+
import { setParticipantSpanAttributes } from "./utils.js";
|
|
29
32
|
const defaultVoiceOptions = {
|
|
30
33
|
allowInterruptions: true,
|
|
31
34
|
discardAudioIfUninterruptible: true,
|
|
@@ -48,9 +51,12 @@ class AgentSession extends EventEmitter {
|
|
|
48
51
|
agent;
|
|
49
52
|
activity;
|
|
50
53
|
nextActivity;
|
|
54
|
+
updateActivityTask;
|
|
51
55
|
started = false;
|
|
52
56
|
userState = "listening";
|
|
53
|
-
|
|
57
|
+
activityLock = new Mutex();
|
|
58
|
+
/** @internal */
|
|
59
|
+
_roomIO;
|
|
54
60
|
logger = log();
|
|
55
61
|
_chatCtx;
|
|
56
62
|
_userData;
|
|
@@ -163,7 +169,7 @@ class AgentSession extends EventEmitter {
|
|
|
163
169
|
this.agent = agent;
|
|
164
170
|
this._updateAgentState("initializing");
|
|
165
171
|
const tasks = [];
|
|
166
|
-
if (room && !this.
|
|
172
|
+
if (room && !this._roomIO) {
|
|
167
173
|
if (this.input.audio && (inputOptions == null ? void 0 : inputOptions.audioEnabled) !== false) {
|
|
168
174
|
this.logger.warn(
|
|
169
175
|
"RoomIO audio input is enabled but input.audio is already set, ignoring.."
|
|
@@ -179,13 +185,13 @@ class AgentSession extends EventEmitter {
|
|
|
179
185
|
"RoomIO transcription output is enabled but output.transcription is already set, ignoring.."
|
|
180
186
|
);
|
|
181
187
|
}
|
|
182
|
-
this.
|
|
188
|
+
this._roomIO = new RoomIO({
|
|
183
189
|
agentSession: this,
|
|
184
190
|
room,
|
|
185
191
|
inputOptions,
|
|
186
192
|
outputOptions
|
|
187
193
|
});
|
|
188
|
-
this.
|
|
194
|
+
this._roomIO.start();
|
|
189
195
|
}
|
|
190
196
|
let ctx = void 0;
|
|
191
197
|
try {
|
|
@@ -214,7 +220,7 @@ class AgentSession extends EventEmitter {
|
|
|
214
220
|
}
|
|
215
221
|
}
|
|
216
222
|
}
|
|
217
|
-
tasks.push(this.
|
|
223
|
+
tasks.push(this._updateActivity(this.agent, { waitOnEnter: false }));
|
|
218
224
|
await Promise.allSettled(tasks);
|
|
219
225
|
this.logger.debug(
|
|
220
226
|
`using audio io: ${this.input.audio ? "`" + this.input.audio.constructor.name + "`" : "(none)"} -> \`AgentSession\` -> ${this.output.audio ? "`" + this.output.audio.constructor.name + "`" : "(none)"}`
|
|
@@ -264,8 +270,28 @@ class AgentSession extends EventEmitter {
|
|
|
264
270
|
}
|
|
265
271
|
updateAgent(agent) {
|
|
266
272
|
this.agent = agent;
|
|
267
|
-
if (this.started) {
|
|
268
|
-
|
|
273
|
+
if (!this.started) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const _updateActivityTask = async (oldTask2, agent2) => {
|
|
277
|
+
if (oldTask2) {
|
|
278
|
+
try {
|
|
279
|
+
await oldTask2.result;
|
|
280
|
+
} catch (error) {
|
|
281
|
+
this.logger.error(error, "previous updateAgent transition failed");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
await this._updateActivity(agent2);
|
|
285
|
+
};
|
|
286
|
+
const oldTask = this.updateActivityTask;
|
|
287
|
+
this.updateActivityTask = Task.from(
|
|
288
|
+
async () => _updateActivityTask(oldTask, agent),
|
|
289
|
+
void 0,
|
|
290
|
+
"AgentSession_updateActivityTask"
|
|
291
|
+
);
|
|
292
|
+
const runState = this._globalRunState;
|
|
293
|
+
if (runState) {
|
|
294
|
+
runState._watchHandle(this.updateActivityTask);
|
|
269
295
|
}
|
|
270
296
|
}
|
|
271
297
|
commitUserTurn() {
|
|
@@ -284,20 +310,36 @@ class AgentSession extends EventEmitter {
|
|
|
284
310
|
if (!this.activity) {
|
|
285
311
|
throw new Error("AgentSession is not running");
|
|
286
312
|
}
|
|
287
|
-
const doSay = (activity) => {
|
|
313
|
+
const doSay = (activity, nextActivity) => {
|
|
314
|
+
if (activity.schedulingPaused) {
|
|
315
|
+
if (!nextActivity) {
|
|
316
|
+
throw new Error("AgentSession is closing, cannot use say()");
|
|
317
|
+
}
|
|
318
|
+
return nextActivity.say(text, options);
|
|
319
|
+
}
|
|
288
320
|
return activity.say(text, options);
|
|
289
321
|
};
|
|
322
|
+
const runState = this._globalRunState;
|
|
323
|
+
let handle;
|
|
290
324
|
const activeSpan = trace.getActiveSpan();
|
|
291
325
|
if (!activeSpan && this.rootSpanContext) {
|
|
292
|
-
|
|
326
|
+
handle = otelContext.with(
|
|
327
|
+
this.rootSpanContext,
|
|
328
|
+
() => doSay(this.activity, this.nextActivity)
|
|
329
|
+
);
|
|
330
|
+
} else {
|
|
331
|
+
handle = doSay(this.activity, this.nextActivity);
|
|
332
|
+
}
|
|
333
|
+
if (runState) {
|
|
334
|
+
runState._watchHandle(handle);
|
|
293
335
|
}
|
|
294
|
-
return
|
|
336
|
+
return handle;
|
|
295
337
|
}
|
|
296
|
-
interrupt() {
|
|
338
|
+
interrupt(options) {
|
|
297
339
|
if (!this.activity) {
|
|
298
340
|
throw new Error("AgentSession is not running");
|
|
299
341
|
}
|
|
300
|
-
return this.activity.interrupt();
|
|
342
|
+
return this.activity.interrupt(options);
|
|
301
343
|
}
|
|
302
344
|
generateReply(options) {
|
|
303
345
|
if (!this.activity) {
|
|
@@ -308,7 +350,7 @@ class AgentSession extends EventEmitter {
|
|
|
308
350
|
content: options.userInput
|
|
309
351
|
}) : void 0;
|
|
310
352
|
const doGenerateReply = (activity, nextActivity) => {
|
|
311
|
-
if (activity.
|
|
353
|
+
if (activity.schedulingPaused) {
|
|
312
354
|
if (!nextActivity) {
|
|
313
355
|
throw new Error("AgentSession is closing, cannot use generateReply()");
|
|
314
356
|
}
|
|
@@ -344,43 +386,99 @@ class AgentSession extends EventEmitter {
|
|
|
344
386
|
* result.expect.noMoreEvents();
|
|
345
387
|
* ```
|
|
346
388
|
*
|
|
347
|
-
* @param options - Run options including user input
|
|
389
|
+
* @param options - Run options including user input and optional output type
|
|
348
390
|
* @returns A RunResult that resolves when the agent finishes responding
|
|
349
|
-
*
|
|
350
|
-
* TODO: Add outputType parameter for typed outputs (parity with Python)
|
|
351
391
|
*/
|
|
352
|
-
run(
|
|
392
|
+
run({
|
|
393
|
+
userInput,
|
|
394
|
+
outputType
|
|
395
|
+
}) {
|
|
353
396
|
if (this._globalRunState && !this._globalRunState.done()) {
|
|
354
397
|
throw new Error("nested runs are not supported");
|
|
355
398
|
}
|
|
356
|
-
const runState = new RunResult({
|
|
399
|
+
const runState = new RunResult({
|
|
400
|
+
userInput,
|
|
401
|
+
outputType
|
|
402
|
+
});
|
|
357
403
|
this._globalRunState = runState;
|
|
358
|
-
|
|
404
|
+
(async () => {
|
|
405
|
+
try {
|
|
406
|
+
const unlock = await this.activityLock.lock();
|
|
407
|
+
unlock();
|
|
408
|
+
this.generateReply({ userInput });
|
|
409
|
+
} catch (e) {
|
|
410
|
+
runState._reject(e instanceof Error ? e : new Error(String(e)));
|
|
411
|
+
}
|
|
412
|
+
})();
|
|
359
413
|
return runState;
|
|
360
414
|
}
|
|
361
|
-
|
|
415
|
+
/** @internal */
|
|
416
|
+
async _updateActivity(agent, options = {}) {
|
|
417
|
+
const { previousActivity = "close", newActivity = "start", blockedTasks = [] } = options;
|
|
418
|
+
const waitOnEnter = options.waitOnEnter ?? newActivity === "start";
|
|
362
419
|
const runWithContext = async () => {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
420
|
+
const unlock = await this.activityLock.lock();
|
|
421
|
+
let onEnterTask;
|
|
422
|
+
try {
|
|
423
|
+
this.agent = agent;
|
|
424
|
+
const prevActivityObj = this.activity;
|
|
425
|
+
if (newActivity === "start") {
|
|
426
|
+
const prevAgent = prevActivityObj == null ? void 0 : prevActivityObj.agent;
|
|
427
|
+
if (agent._agentActivity && // allow updating the same agent that is running
|
|
428
|
+
(agent !== prevAgent || previousActivity !== "close")) {
|
|
429
|
+
throw new Error("Cannot start agent: an activity is already running");
|
|
430
|
+
}
|
|
431
|
+
this.nextActivity = new AgentActivity(agent, this);
|
|
432
|
+
} else if (newActivity === "resume") {
|
|
433
|
+
if (!agent._agentActivity) {
|
|
434
|
+
throw new Error("Cannot resume agent: no existing activity to resume");
|
|
435
|
+
}
|
|
436
|
+
this.nextActivity = agent._agentActivity;
|
|
437
|
+
}
|
|
438
|
+
if (prevActivityObj && prevActivityObj !== this.nextActivity) {
|
|
439
|
+
if (previousActivity === "pause") {
|
|
440
|
+
await prevActivityObj.pause({ blockedTasks });
|
|
441
|
+
} else {
|
|
442
|
+
await prevActivityObj.drain();
|
|
443
|
+
await prevActivityObj.close();
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
this.activity = this.nextActivity;
|
|
447
|
+
this.nextActivity = void 0;
|
|
448
|
+
const runState = this._globalRunState;
|
|
449
|
+
const handoffItem = new AgentHandoffItem({
|
|
450
|
+
oldAgentId: prevActivityObj == null ? void 0 : prevActivityObj.agent.id,
|
|
374
451
|
newAgentId: agent.id
|
|
375
|
-
})
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
this.
|
|
452
|
+
});
|
|
453
|
+
if (runState) {
|
|
454
|
+
runState._agentHandoff({
|
|
455
|
+
item: handoffItem,
|
|
456
|
+
oldAgent: prevActivityObj == null ? void 0 : prevActivityObj.agent,
|
|
457
|
+
newAgent: this.activity.agent
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
this._chatCtx.insert(handoffItem);
|
|
461
|
+
this.logger.debug(
|
|
462
|
+
{ previousAgentId: prevActivityObj == null ? void 0 : prevActivityObj.agent.id, newAgentId: agent.id },
|
|
463
|
+
"Agent handoff inserted into chat context"
|
|
464
|
+
);
|
|
465
|
+
if (newActivity === "start") {
|
|
466
|
+
await this.activity.start();
|
|
467
|
+
} else {
|
|
468
|
+
await this.activity.resume();
|
|
469
|
+
}
|
|
470
|
+
onEnterTask = this.activity._onEnterTask;
|
|
471
|
+
if (this._input.audio) {
|
|
472
|
+
this.activity.attachAudioInput(this._input.audio.stream);
|
|
473
|
+
}
|
|
474
|
+
} finally {
|
|
475
|
+
unlock();
|
|
476
|
+
}
|
|
477
|
+
if (waitOnEnter) {
|
|
478
|
+
if (!onEnterTask) {
|
|
479
|
+
throw new Error("expected onEnter task to be available while waitOnEnter=true");
|
|
480
|
+
}
|
|
481
|
+
await onEnterTask.result;
|
|
384
482
|
}
|
|
385
483
|
};
|
|
386
484
|
if (this.rootSpanContext) {
|
|
@@ -455,6 +553,7 @@ class AgentSession extends EventEmitter {
|
|
|
455
553
|
}
|
|
456
554
|
/** @internal */
|
|
457
555
|
_updateAgentState(state, options) {
|
|
556
|
+
var _a;
|
|
458
557
|
if (this._agentState === state) {
|
|
459
558
|
return;
|
|
460
559
|
}
|
|
@@ -467,6 +566,10 @@ class AgentSession extends EventEmitter {
|
|
|
467
566
|
context: (options == null ? void 0 : options.otelContext) ?? this.rootSpanContext,
|
|
468
567
|
startTime: options == null ? void 0 : options.startTime
|
|
469
568
|
});
|
|
569
|
+
const localParticipant = (_a = this._roomIO) == null ? void 0 : _a.localParticipant;
|
|
570
|
+
if (localParticipant) {
|
|
571
|
+
setParticipantSpanAttributes(this.agentSpeakingSpan, localParticipant);
|
|
572
|
+
}
|
|
470
573
|
}
|
|
471
574
|
} else if (this.agentSpeakingSpan !== void 0) {
|
|
472
575
|
this.agentSpeakingSpan.end();
|
|
@@ -486,6 +589,7 @@ class AgentSession extends EventEmitter {
|
|
|
486
589
|
}
|
|
487
590
|
/** @internal */
|
|
488
591
|
_updateUserState(state, lastSpeakingTime) {
|
|
592
|
+
var _a;
|
|
489
593
|
if (this.userState === state) {
|
|
490
594
|
return;
|
|
491
595
|
}
|
|
@@ -495,6 +599,10 @@ class AgentSession extends EventEmitter {
|
|
|
495
599
|
context: this.rootSpanContext,
|
|
496
600
|
startTime: lastSpeakingTime
|
|
497
601
|
});
|
|
602
|
+
const linked = (_a = this._roomIO) == null ? void 0 : _a.linkedParticipant;
|
|
603
|
+
if (linked) {
|
|
604
|
+
setParticipantSpanAttributes(this.userSpeakingSpan, linked);
|
|
605
|
+
}
|
|
498
606
|
} else if (this.userSpeakingSpan !== void 0) {
|
|
499
607
|
this.userSpeakingSpan.end(lastSpeakingTime);
|
|
500
608
|
this.userSpeakingSpan = void 0;
|
|
@@ -529,7 +637,7 @@ class AgentSession extends EventEmitter {
|
|
|
529
637
|
if (this.options.userAwayTimeout === null || this.options.userAwayTimeout === void 0) {
|
|
530
638
|
return;
|
|
531
639
|
}
|
|
532
|
-
if (this.
|
|
640
|
+
if (this._roomIO && !this._roomIO.isParticipantAvailable) {
|
|
533
641
|
return;
|
|
534
642
|
}
|
|
535
643
|
this.userAwayTimer = setTimeout(() => {
|
|
@@ -567,12 +675,16 @@ class AgentSession extends EventEmitter {
|
|
|
567
675
|
if (this.activity) {
|
|
568
676
|
if (!drain) {
|
|
569
677
|
try {
|
|
570
|
-
this.activity.interrupt();
|
|
678
|
+
await this.activity.interrupt({ force: true }).await;
|
|
571
679
|
} catch (error2) {
|
|
680
|
+
this.logger.warn({ error: error2 }, "Error interrupting activity");
|
|
572
681
|
}
|
|
573
682
|
}
|
|
574
683
|
await this.activity.drain();
|
|
575
684
|
await ((_a = this.activity.currentSpeech) == null ? void 0 : _a.waitForPlayout());
|
|
685
|
+
if (reason !== CloseReason.ERROR) {
|
|
686
|
+
this.activity.commitUserTurn({ audioDetached: true, throwIfNotReady: false });
|
|
687
|
+
}
|
|
576
688
|
try {
|
|
577
689
|
this.activity.detachAudioInput();
|
|
578
690
|
} catch (error2) {
|
|
@@ -584,8 +696,8 @@ class AgentSession extends EventEmitter {
|
|
|
584
696
|
this.input.audio = null;
|
|
585
697
|
this.output.audio = null;
|
|
586
698
|
this.output.transcription = null;
|
|
587
|
-
await ((_b = this.
|
|
588
|
-
this.
|
|
699
|
+
await ((_b = this._roomIO) == null ? void 0 : _b.close());
|
|
700
|
+
this._roomIO = void 0;
|
|
589
701
|
await ((_c = this.activity) == null ? void 0 : _c.close());
|
|
590
702
|
this.activity = void 0;
|
|
591
703
|
if (this.sessionSpan) {
|