Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/agents-extensions/src/TwilioRealtimeTransport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ export class TwilioRealtimeTransportLayer extends OpenAIRealtimeWebSocket {
await super.connect(options);
}

updateSessionConfig(config: Partial<RealtimeSessionConfig>): void {
const newConfig = this._setInputAndOutputAudioFormat(config);
super.updateSessionConfig(newConfig);
}

_interrupt(_elapsedTime: number) {
const elapsedTime = this.#lastPlayedChunkCount + 50; /* 50ms buffer */
this.#logger.debug(
Expand Down
19 changes: 19 additions & 0 deletions packages/agents-extensions/test/TwilioRealtimeTransport.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ vi.mock('@openai/agents/realtime', () => {
FakeOpenAIRealtimeWebSocket.prototype.sendAudio = vi.fn();
FakeOpenAIRealtimeWebSocket.prototype.close = vi.fn();
FakeOpenAIRealtimeWebSocket.prototype._interrupt = vi.fn();
FakeOpenAIRealtimeWebSocket.prototype.updateSessionConfig = vi.fn();
return { OpenAIRealtimeWebSocket: FakeOpenAIRealtimeWebSocket, utils };
});

Expand Down Expand Up @@ -146,4 +147,22 @@ describe('TwilioRealtimeTransportLayer', () => {
expect(marks[2].mark.name).toBe('b:1');
expect(audioListener).toHaveBeenCalledTimes(3);
});

test('updateSessionConfig keeps audio format', async () => {
const twilio = new FakeTwilioWebSocket();
const transport = new TwilioRealtimeTransportLayer({
twilioWebSocket: twilio as any,
});
await transport.connect({ apiKey: 'ek_test' } as any);
const { OpenAIRealtimeWebSocket } = await import('@openai/agents/realtime');
const spy = vi.mocked(
OpenAIRealtimeWebSocket.prototype.updateSessionConfig,
);
transport.updateSessionConfig({ instructions: 'hi' });
expect(spy).toHaveBeenCalledWith({
instructions: 'hi',
inputAudioFormat: 'g711_ulaw',
outputAudioFormat: 'g711_ulaw',
});
});
});