Skip to content

Commit a77d2c1

Browse files
Solvely-Colinsteipete
authored andcommitted
fix: address realtime voice review feedback
1 parent 7a2a31d commit a77d2c1

4 files changed

Lines changed: 41 additions & 7 deletions

File tree

src/gateway/server-methods/talk-shared.ts

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,11 @@ export function buildRealtimeVoiceLaunchOptions(params: {
243243
requested: RealtimeVoiceLaunchOptionInput;
244244
defaults: RealtimeVoiceLaunchOptions;
245245
}): RealtimeVoiceLaunchOptions {
246-
return withRealtimeBrowserOverrides(
247-
params.defaults,
248-
params.requested,
249-
) as RealtimeVoiceLaunchOptions;
246+
const options = pickRealtimeVoiceLaunchOptions(params.defaults);
247+
return {
248+
...options,
249+
...pickRealtimeVoiceLaunchOptions(params.requested),
250+
};
250251
}
251252

252253
export function withRealtimeBrowserOverrides(
@@ -278,6 +279,34 @@ export function withRealtimeBrowserOverrides(
278279
return Object.keys(overrides).length > 0 ? { ...providerConfig, ...overrides } : providerConfig;
279280
}
280281

282+
function pickRealtimeVoiceLaunchOptions(
283+
params: RealtimeVoiceLaunchOptionInput,
284+
): RealtimeVoiceLaunchOptions {
285+
const options: RealtimeVoiceLaunchOptions = {};
286+
const model = normalizeOptionalString(params.model);
287+
const voice = normalizeOptionalString(params.voice);
288+
const reasoningEffort = normalizeOptionalString(params.reasoningEffort);
289+
if (model) {
290+
options.model = model;
291+
}
292+
if (voice) {
293+
options.voice = voice;
294+
}
295+
if (typeof params.vadThreshold === "number" && Number.isFinite(params.vadThreshold)) {
296+
options.vadThreshold = params.vadThreshold;
297+
}
298+
if (typeof params.silenceDurationMs === "number" && Number.isFinite(params.silenceDurationMs)) {
299+
options.silenceDurationMs = params.silenceDurationMs;
300+
}
301+
if (typeof params.prefixPaddingMs === "number" && Number.isFinite(params.prefixPaddingMs)) {
302+
options.prefixPaddingMs = params.prefixPaddingMs;
303+
}
304+
if (reasoningEffort) {
305+
options.reasoningEffort = reasoningEffort;
306+
}
307+
return options;
308+
}
309+
281310
export function isUnsupportedBrowserWebRtcSession(session: RealtimeVoiceBrowserSession): boolean {
282311
const provider = normalizeLowercaseStringOrEmpty(session.provider);
283312
const transport = (session as { transport?: string }).transport ?? "webrtc";

src/gateway/server-methods/talk.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ describe("talk.client.create handler", () => {
11991199
});
12001200

12011201
it("uses talk.realtime provider, model, voice, and instructions without reading speech provider config", async () => {
1202-
const createBrowserSession = vi.fn(async () => ({
1202+
const createBrowserSession = vi.fn(async (_input: unknown) => ({
12031203
provider: "openai",
12041204
transport: "webrtc" as const,
12051205
clientSecret: "secret",
@@ -1264,6 +1264,10 @@ describe("talk.client.create handler", () => {
12641264
reasoningEffort: "low",
12651265
}),
12661266
);
1267+
const createInput = createBrowserSession.mock.calls[0]?.[0] as Record<string, unknown>;
1268+
expect(createInput).not.toHaveProperty("provider");
1269+
expect(createInput).not.toHaveProperty("providers");
1270+
expect(createInput).not.toHaveProperty("transport");
12671271
expect(respond).toHaveBeenCalledWith(
12681272
true,
12691273
expect.objectContaining({ provider: "openai", transport: "webrtc" }),

ui/src/ui/chat/realtime-talk-gateway-relay.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ export class GatewayRelayRealtimeTalkTransport implements RealtimeTalkTransport
142142
"error",
143143
error instanceof Error ? error.message : String(error),
144144
);
145-
this.stopLocal();
145+
this.stop();
146146
}
147147
});
148148
};

ui/src/ui/realtime-talk-gateway-relay.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ describe("GatewayRelayRealtimeTalkTransport", () => {
247247
.mocked(client.request)
248248
.mock.calls.filter(([method]) => method === "talk.session.close");
249249
expect(appendCalls).toHaveLength(1);
250-
expect(closeCalls).toHaveLength(0);
250+
expect(closeCalls).toHaveLength(1);
251+
expect(closeCalls[0]?.[1]).toEqual({ sessionId: "relay-1" });
251252
});
252253

253254
it("treats relay close events as local shutdown", async () => {

0 commit comments

Comments
 (0)