Skip to content

Commit 8524731

Browse files
fix(voice): wire debug messages over remote sessions (#1645)
Co-authored-by: rosetta-livekit-bot[bot] <282703043+rosetta-livekit-bot[bot]@users.noreply.github.com> Co-authored-by: Brian Yin <brian.yin@livekit.io>
1 parent f71ab2d commit 8524731

6 files changed

Lines changed: 34 additions & 8 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@livekit/agents": patch
3+
---
4+
5+
Wire internal debug messages through remote sessions.

agents/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@
5353
"@bufbuild/protobuf": "^1.10.0",
5454
"@ffmpeg-installer/ffmpeg": "^1.1.0",
5555
"@livekit/mutex": "^1.1.1",
56-
"@livekit/protocol": "^1.45.7",
57-
"@livekit/typed-emitter": "^3.0.0",
56+
"@livekit/protocol": "^1.46.4",
5857
"@livekit/throws-transformer": "0.1.8",
58+
"@livekit/typed-emitter": "^3.0.0",
5959
"@opentelemetry/api": "^1.9.0",
6060
"@opentelemetry/api-logs": "^0.54.0",
6161
"@opentelemetry/core": "^2.2.0",

agents/src/voice/agent_session.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// SPDX-FileCopyrightText: 2024 LiveKit, Inc.
22
//
33
// SPDX-License-Identifier: Apache-2.0
4+
import { type JsonObject, Struct } from '@bufbuild/protobuf';
45
import { Mutex } from '@livekit/mutex';
6+
import { AgentSession as pb } from '@livekit/protocol';
57
import type { AudioFrame, Room } from '@livekit/rtc-node';
68
import { ThrowsPromise } from '@livekit/throws-transformer/throws';
79
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
@@ -153,6 +155,7 @@ export type AgentSessionCallbacks = {
153155
[AgentSessionEventTypes.FunctionToolsExecuted]: (ev: FunctionToolsExecutedEvent) => void;
154156
[AgentSessionEventTypes.MetricsCollected]: (ev: MetricsCollectedEvent) => void;
155157
[AgentSessionEventTypes.SessionUsageUpdated]: (ev: SessionUsageUpdatedEvent) => void;
158+
[AgentSessionEventTypes.DebugMessage]: (ev: pb.DebugMessage) => void;
156159
[AgentSessionEventTypes.SpeechCreated]: (ev: SpeechCreatedEvent) => void;
157160
[AgentSessionEventTypes.AgentFalseInterruption]: (ev: AgentFalseInterruptionEvent) => void;
158161
[AgentSessionEventTypes.Error]: (ev: ErrorEvent) => void;
@@ -740,6 +743,12 @@ export class AgentSession<
740743
return this.activity.interrupt(options);
741744
}
742745

746+
/** @internal — emit a debug/trace payload to the debugger/recorder. */
747+
_emitDebugMessage(payload: JsonObject): void {
748+
const debugMessage = new pb.DebugMessage({ payload: Struct.fromJson(payload) });
749+
super.emit(AgentSessionEventTypes.DebugMessage, debugMessage);
750+
}
751+
743752
/**
744753
* The currently bound `AMD` instance, or `null` if AMD is not in use.
745754
* Mirrors python `AgentSession.amd`.

agents/src/voice/events.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export enum AgentSessionEventTypes {
3030
FunctionToolsExecuted = 'function_tools_executed',
3131
MetricsCollected = 'metrics_collected',
3232
SessionUsageUpdated = 'session_usage_updated',
33+
DebugMessage = 'debug_message',
3334
SpeechCreated = 'speech_created',
3435
AgentFalseInterruption = 'agent_false_interruption',
3536
OverlappingSpeech = 'overlapping_speech',

agents/src/voice/remote_session.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export type RemoteSessionEventTypes =
6363
| 'overlapping_speech'
6464
| 'amd_prediction'
6565
| 'session_usage'
66+
| 'debug_message'
6667
| 'error';
6768

6869
/** @experimental */
@@ -75,6 +76,7 @@ export type RemoteSessionCallbacks = {
7576
overlapping_speech: (ev: pb.AgentSessionEvent_OverlappingSpeech) => void;
7677
amd_prediction: (ev: pb.AgentSessionEvent_AmdPrediction) => void;
7778
session_usage: (ev: pb.AgentSessionEvent_SessionUsageUpdated) => void;
79+
debug_message: (ev: pb.DebugMessage) => void;
7880
error: (ev: pb.AgentSessionEvent_Error) => void;
7981
};
8082

@@ -522,6 +524,7 @@ export class SessionHost {
522524
session.on(AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);
523525
session.on(AgentSessionEventTypes.OverlappingSpeech, this.onOverlappingSpeech);
524526
session.on(AgentSessionEventTypes.Error, this.onHostError);
527+
session.on(AgentSessionEventTypes.DebugMessage, this.onDebugMessage);
525528
}
526529
}
527530

@@ -550,6 +553,7 @@ export class SessionHost {
550553
this.session.off(AgentSessionEventTypes.MetricsCollected, this.onMetricsCollected);
551554
this.session.off(AgentSessionEventTypes.OverlappingSpeech, this.onOverlappingSpeech);
552555
this.session.off(AgentSessionEventTypes.Error, this.onHostError);
556+
this.session.off(AgentSessionEventTypes.DebugMessage, this.onDebugMessage);
553557
}
554558

555559
if (this.recvTask) {
@@ -713,6 +717,10 @@ export class SessionHost {
713717
);
714718
};
715719

720+
private onDebugMessage = (event: pb.DebugMessage): void => {
721+
this.emitEvent({ case: 'debugMessage', value: event });
722+
};
723+
716724
/**
717725
* @internal — forwards an AMD prediction to the connected
718726
* {@link RemoteSession} peer. Mirrors python
@@ -1004,6 +1012,9 @@ export class RemoteSession extends (EventEmitter as new () => TypedEventEmitter<
10041012
case 'sessionUsageUpdated':
10051013
this.emit('session_usage', ev.value);
10061014
break;
1015+
case 'debugMessage':
1016+
this.emit('debug_message', ev.value);
1017+
break;
10071018
case 'error':
10081019
this.emit('error', ev.value);
10091020
break;

pnpm-lock.yaml

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)