@@ -188,15 +188,23 @@ async def connect(self, options: RealtimeModelConfig) -> None:
188
188
else :
189
189
self ._tracing_config = "auto"
190
190
191
- if not api_key :
192
- raise UserError ("API key is required but was not provided." )
193
-
194
191
url = options .get ("url" , f"wss://api.openai.com/v1/realtime?model={ self .model } " )
195
192
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
+ )
200
208
self ._websocket = await websockets .connect (
201
209
url ,
202
210
user_agent_header = _USER_AGENT ,
@@ -490,9 +498,7 @@ async def _handle_ws_event(self, event: dict[str, Any]):
490
498
try :
491
499
if "previous_item_id" in event and event ["previous_item_id" ] is None :
492
500
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 )
496
502
except pydantic .ValidationError as e :
497
503
logger .error (f"Failed to validate server event: { event } " , exc_info = True )
498
504
await self ._emit_event (
@@ -583,11 +589,13 @@ async def _handle_ws_event(self, event: dict[str, Any]):
583
589
):
584
590
await self ._handle_output_item (parsed .item )
585
591
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
+ )
591
599
592
600
def _update_created_session (self , session : OpenAISessionObject ) -> None :
593
601
self ._created_session = session
0 commit comments