From 2a9c9c479c9b9b94c41abe91933f2d8922cdc708 Mon Sep 17 00:00:00 2001 From: Mark Stuart <323302876+markstuart-oai@users.noreply.github.com> Date: Tue, 27 Oct 2026 06:28:11 +0000 Subject: [PATCH 1/2] fix(realtime): honor the selected WebSocket session target --- src/realtime/internal-base.ts | 3 +++ tests/realtime-wire-lifecycle.test.ts | 29 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/realtime/internal-base.ts b/src/realtime/internal-base.ts index 9e69dde4d..4738ab83e 100644 --- a/src/realtime/internal-base.ts +++ b/src/realtime/internal-base.ts @@ -299,6 +299,9 @@ export function buildRealtimeURL( url.search = ''; } else { url.pathname += url.pathname.endsWith('/') ? 'realtime' : '/realtime'; + url.searchParams.delete('model'); + url.searchParams.delete('intent'); + url.searchParams.delete('call_id'); } url.hash = ''; diff --git a/tests/realtime-wire-lifecycle.test.ts b/tests/realtime-wire-lifecycle.test.ts index 56f1b75ac..11b4d854b 100644 --- a/tests/realtime-wire-lifecycle.test.ts +++ b/tests/realtime-wire-lifecycle.test.ts @@ -69,6 +69,35 @@ afterAll(async () => { await stopped; }); +describe.each([StableWS, StableNative])('GA Realtime target selection (%s)', (Realtime) => { + test.each([ + { target: { model: 'chosen-model' }, selected: ['model', 'chosen-model'] }, + { target: { intent: 'transcription' }, selected: ['intent', 'transcription'] }, + { target: { callID: 'call_test_+/&' }, selected: ['call_id', 'call_test_+/&'] }, + ] satisfies { target: RealtimeConnectionConfig; selected: string[] }[])( + 'replaces stale base URL targets with $selected', + async ({ target, selected }) => { + const incoming = once(peers, 'connection'); + const client = new OpenAI({ + baseURL: `${baseURL}?model=old&model=other&intent=old&call_id=old&tenant=one`, + apiKey: 'ek_synthetic_wire', + }); + const realtime = new Realtime({ ...target, options: settings.options }, client); + const opened = rawEvent(realtime.socket, 'open'); + try { + const [, request] = await incoming; + await opened; + const url = new URL(request.url, baseURL); + expect([...url.searchParams]).toEqual([['tenant', 'one'], selected]); + } finally { + const closed = rawEvent(realtime.socket, 'close'); + realtime.close(); + await closed; + } + }, + ); +}); + describe.each([ { label: 'GA ws', Realtime: StableWS, native: false, beta: false }, { label: 'beta ws', Realtime: BetaWS, native: false, beta: true }, From af0adca2953fdaae609d0e2d3b7dd3ab72f60618 Mon Sep 17 00:00:00 2001 From: Mark Stuart <323302876+markstuart-oai@users.noreply.github.com> Date: Wed, 28 Oct 2026 02:54:40 +0000 Subject: [PATCH 2/2] fix(realtime): clear stale selectors in beta connections --- src/beta/realtime/internal-base.ts | 5 +++++ tests/realtime-wire-lifecycle.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/beta/realtime/internal-base.ts b/src/beta/realtime/internal-base.ts index 2323b9c37..8de57838e 100644 --- a/src/beta/realtime/internal-base.ts +++ b/src/beta/realtime/internal-base.ts @@ -197,6 +197,11 @@ export function buildRealtimeURL( } url.protocol = 'wss'; + if (!azure) { + url.searchParams.delete('model'); + url.searchParams.delete('intent'); + url.searchParams.delete('call_id'); + } // Sideband control connections attach to an existing call via `call_id`. if (azure) { if (hasCallID) { diff --git a/tests/realtime-wire-lifecycle.test.ts b/tests/realtime-wire-lifecycle.test.ts index 11b4d854b..4a6665852 100644 --- a/tests/realtime-wire-lifecycle.test.ts +++ b/tests/realtime-wire-lifecycle.test.ts @@ -98,6 +98,30 @@ describe.each([StableWS, StableNative])('GA Realtime target selection (%s)', (Re ); }); +describe.each([BetaWS, BetaNative])('beta Realtime target selection (%s)', (Realtime) => { + test.each([ + { target: { model: 'chosen-model' }, selected: ['model', 'chosen-model'] }, + { target: { callID: 'call_test_+/&' }, selected: ['call_id', 'call_test_+/&'] }, + ])('replaces stale base URL targets with $selected', async ({ target, selected }) => { + const incoming = once(peers, 'connection'); + const client = new OpenAI({ + baseURL: `${baseURL}?model=old&model=other&intent=old&call_id=old&call_id=other&tenant=one`, + apiKey: 'ek_synthetic_wire', + }); + const realtime = new Realtime({ ...target, options: settings.options }, client); + const opened = rawEvent(realtime.socket, 'open'); + try { + const [, request] = await incoming; + await opened; + expect([...new URL(request.url, baseURL).searchParams]).toEqual([['tenant', 'one'], selected]); + } finally { + const closed = rawEvent(realtime.socket, 'close'); + realtime.close(); + await closed; + } + }); +}); + describe.each([ { label: 'GA ws', Realtime: StableWS, native: false, beta: false }, { label: 'beta ws', Realtime: BetaWS, native: false, beta: true },