From 7717b8925bb7f6982a11d0fbbc97052e9ff197eb Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 3 Aug 2026 03:02:09 +0800 Subject: [PATCH] test(openai): verify live realtime bridge reuse --- .../realtime-voice-provider.live.test.ts | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 extensions/openai/realtime-voice-provider.live.test.ts diff --git a/extensions/openai/realtime-voice-provider.live.test.ts b/extensions/openai/realtime-voice-provider.live.test.ts new file mode 100644 index 000000000000..539de439389e --- /dev/null +++ b/extensions/openai/realtime-voice-provider.live.test.ts @@ -0,0 +1,50 @@ +// OpenAI tests cover the native realtime voice bridge against the live API. +import { describe, expect, it } from "vitest"; +import { buildOpenAIRealtimeVoiceProvider } from "./realtime-voice-provider.js"; + +const OPENAI_API_KEY = process.env.OPENAI_API_KEY?.trim() ?? ""; +const LIVE_ENABLED = OPENAI_API_KEY.length > 0 && process.env.OPENCLAW_LIVE_TEST === "1"; +const describeLive = LIVE_ENABLED ? describe : describe.skip; + +describeLive("OpenAI realtime voice lifecycle live", () => { + it("reuses a bridge after a terminal close", async () => { + let closeCount = 0; + let readyCount = 0; + const errors: Error[] = []; + const bridge = buildOpenAIRealtimeVoiceProvider().createBridge({ + providerConfig: { + apiKey: OPENAI_API_KEY, + model: "gpt-realtime-2.1", + voice: "marin", + }, + instructions: "Keep this lifecycle verification session silent.", + autoRespondToAudio: false, + onAudio: () => {}, + onClearAudio: () => {}, + onClose: () => { + closeCount += 1; + }, + onError: (error) => { + errors.push(error); + }, + onReady: () => { + readyCount += 1; + }, + }); + + try { + await bridge.connect(); + expect(bridge.isConnected()).toBe(true); + bridge.close(); + + await bridge.connect(); + expect(bridge.isConnected()).toBe(true); + } finally { + bridge.close(); + } + + expect(errors).toEqual([]); + expect(readyCount).toBe(2); + expect(closeCount).toBe(2); + }, 60_000); +});