@@ -188,15 +188,23 @@ async def connect(self, options: RealtimeModelConfig) -> None:
188188 else :
189189 self ._tracing_config = "auto"
190190
191- if not api_key :
192- raise UserError ("API key is required but was not provided." )
193-
194191 url = options .get ("url" , f"wss://api.openai.com/v1/realtime?model={ self .model } " )
195192
196- headers = {
197- "Authorization" : f"Bearer { api_key } " ,
198- "OpenAI-Beta" : "realtime=v1" ,
199- }
193+ headers : dict [str , str ] = {}
194+ if options .get ("headers" ) is not None :
195+ # For customizing request headers
196+ headers .update (options ["headers" ])
197+ else :
198+ # OpenAI's Realtime API
199+ if not api_key :
200+ raise UserError ("API key is required but was not provided." )
201+
202+ headers .update (
203+ {
204+ "Authorization" : f"Bearer { api_key } " ,
205+ "OpenAI-Beta" : "realtime=v1" ,
206+ }
207+ )
200208 self ._websocket = await websockets .connect (
201209 url ,
202210 user_agent_header = _USER_AGENT ,
@@ -490,9 +498,7 @@ async def _handle_ws_event(self, event: dict[str, Any]):
490498 try :
491499 if "previous_item_id" in event and event ["previous_item_id" ] is None :
492500 event ["previous_item_id" ] = "" # TODO (rm) remove
493- parsed : AllRealtimeServerEvents = self ._server_event_type_adapter .validate_python (
494- event
495- )
501+ parsed : AllRealtimeServerEvents = self ._server_event_type_adapter .validate_python (event )
496502 except pydantic .ValidationError as e :
497503 logger .error (f"Failed to validate server event: { event } " , exc_info = True )
498504 await self ._emit_event (
@@ -583,11 +589,13 @@ async def _handle_ws_event(self, event: dict[str, Any]):
583589 ):
584590 await self ._handle_output_item (parsed .item )
585591 elif parsed .type == "input_audio_buffer.timeout_triggered" :
586- await self ._emit_event (RealtimeModelInputAudioTimeoutTriggeredEvent (
587- item_id = parsed .item_id ,
588- audio_start_ms = parsed .audio_start_ms ,
589- audio_end_ms = parsed .audio_end_ms ,
590- ))
592+ await self ._emit_event (
593+ RealtimeModelInputAudioTimeoutTriggeredEvent (
594+ item_id = parsed .item_id ,
595+ audio_start_ms = parsed .audio_start_ms ,
596+ audio_end_ms = parsed .audio_end_ms ,
597+ )
598+ )
591599
592600 def _update_created_session (self , session : OpenAISessionObject ) -> None :
593601 self ._created_session = session
0 commit comments