Skip to content

Commit abf10c2

Browse files
fix(twilio): maintain audio format after handoff (#126)
Co-authored-by: Kazuhiro Sera <[email protected]>
1 parent 0664056 commit abf10c2

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

packages/agents-extensions/src/TwilioRealtimeTransport.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ export class TwilioRealtimeTransportLayer extends OpenAIRealtimeWebSocket {
176176
await super.connect(options);
177177
}
178178

179+
updateSessionConfig(config: Partial<RealtimeSessionConfig>): void {
180+
const newConfig = this._setInputAndOutputAudioFormat(config);
181+
super.updateSessionConfig(newConfig);
182+
}
183+
179184
_interrupt(_elapsedTime: number) {
180185
const elapsedTime = this.#lastPlayedChunkCount + 50; /* 50ms buffer */
181186
this.#logger.debug(

packages/agents-extensions/test/TwilioRealtimeTransport.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ vi.mock('@openai/agents/realtime', () => {
2626
FakeOpenAIRealtimeWebSocket.prototype.sendAudio = vi.fn();
2727
FakeOpenAIRealtimeWebSocket.prototype.close = vi.fn();
2828
FakeOpenAIRealtimeWebSocket.prototype._interrupt = vi.fn();
29+
FakeOpenAIRealtimeWebSocket.prototype.updateSessionConfig = vi.fn();
2930
return { OpenAIRealtimeWebSocket: FakeOpenAIRealtimeWebSocket, utils };
3031
});
3132

@@ -146,4 +147,22 @@ describe('TwilioRealtimeTransportLayer', () => {
146147
expect(marks[2].mark.name).toBe('b:1');
147148
expect(audioListener).toHaveBeenCalledTimes(3);
148149
});
150+
151+
test('updateSessionConfig keeps audio format', async () => {
152+
const twilio = new FakeTwilioWebSocket();
153+
const transport = new TwilioRealtimeTransportLayer({
154+
twilioWebSocket: twilio as any,
155+
});
156+
await transport.connect({ apiKey: 'ek_test' } as any);
157+
const { OpenAIRealtimeWebSocket } = await import('@openai/agents/realtime');
158+
const spy = vi.mocked(
159+
OpenAIRealtimeWebSocket.prototype.updateSessionConfig,
160+
);
161+
transport.updateSessionConfig({ instructions: 'hi' });
162+
expect(spy).toHaveBeenCalledWith({
163+
instructions: 'hi',
164+
inputAudioFormat: 'g711_ulaw',
165+
outputAudioFormat: 'g711_ulaw',
166+
});
167+
});
149168
});

0 commit comments

Comments
 (0)