From 66e799a6554c276de2505e84ced4cfe65c0afbcf Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Thu, 4 Jun 2026 13:49:56 -0400 Subject: [PATCH] fix: connect directly via websockets to bypass OpenAI-Beta header The openai library's beta.realtime.connect() hardcodes the obsolete 'OpenAI-Beta: realtime=v1' header which the GA API rejects. Connecting directly via the websockets library with only the Authorization header resolves the 'beta_api_shape_disabled' error. --- backend/services/hybrid.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/backend/services/hybrid.py b/backend/services/hybrid.py index 2b4ad4a..b90f1c1 100644 --- a/backend/services/hybrid.py +++ b/backend/services/hybrid.py @@ -58,12 +58,22 @@ class HybridPipeline: return try: + import websockets + self._openai = AsyncOpenAI(api_key=settings.openai_api_key) logger.info("Connecting to gpt-realtime-whisper...") - async with self._openai.beta.realtime.connect( - model="gpt-realtime-whisper", - ) as conn: + + # Connect directly via websockets to avoid the OpenAI-Beta header + url = f"wss://api.openai.com/v1/realtime?model=gpt-realtime-whisper" + ws = await websockets.connect( + url, + additional_headers={ + "Authorization": f"Bearer {settings.openai_api_key}", + }, + ) + + async with ws as conn: self._conn = conn self._connected = True logger.info("Connected to gpt-realtime-whisper") @@ -90,8 +100,10 @@ class HybridPipeline: # Listen for transcription events while self._connected: try: - event = await conn.recv() - await self._handle_event(event) + raw = await conn.recv() + if isinstance(raw, (str, bytes)): + data = json.loads(raw if isinstance(raw, str) else raw.decode()) + await self._handle_event(data) except Exception as e: if self._connected: logger.warning(f"recv error: {e}") @@ -201,7 +213,7 @@ class HybridPipeline: async def _send(self, data: dict): try: - await self._conn.send(data) + await self._conn.send(json.dumps(data)) except Exception as e: logger.warning(f"Send error: {e}")