
    iS                     z    d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z ddlmZ ddlmZ d	d
lmZ  G d de      Zy)z
This file contains the calling OpenAI's `/v1/realtime` endpoint.

This requires websockets, and is currently only supported on LiteLLM Proxy.
    )AnyOptionalcast))REALTIME_WEBSOCKET_MAX_MESSAGE_SIZE_BYTES)RealtimeQueryParams   )Logging)RealTimeStreaming)get_shared_realtime_ssl_context   )OpenAIChatCompletionc                       e Zd ZdZdefdZdedefdZdedefdZ	ded	e
defd
Z	 	 	 	 	 	 	 ddedededee   dee   dee   dee   d	ee
   dee   dee   defdZy)OpenAIRealtimeaD  
    Base handler for OpenAI-compatible realtime WebSocket connections.

    Subclasses can override template methods to customize:
    - _get_default_api_base(): Default API base URL
    - _get_additional_headers(): Extra headers beyond Authorization
    - _get_ssl_config(): SSL configuration for WebSocket connection
    returnc                      y)z
        Get the default API base URL for this provider.
        Override this in subclasses to set provider-specific defaults.
        zhttps://api.openai.com/ )selfs    u/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/openai/realtime/handler.py_get_default_api_basez$OpenAIRealtime._get_default_api_base   s    
 )    api_keyc                     d| ddS )a  
        Get additional headers beyond Authorization.
        Override this in subclasses to customize headers (e.g., remove OpenAI-Beta).

        Args:
            api_key: API key for authentication

        Returns:
            Dictionary of additional headers
        zBearer zrealtime=v1)AuthorizationzOpenAI-Betar   )r   r   s     r   _get_additional_headersz&OpenAIRealtime._get_additional_headers#   s      'wi0(
 	
r   urlc                 H    |j                  d      ryt               }|du ry|S )a  
        Get SSL configuration for WebSocket connection.
        Override this in subclasses to customize SSL behavior.

        Args:
            url: WebSocket URL (ws:// or wss://)

        Returns:
            SSL configuration (None, True, or SSLContext)
        ws://NFT)
startswithr   )r   r   
ssl_configs      r   _get_ssl_configzOpenAIRealtime._get_ssl_config3   s0     >>'" 56
 r   api_basequery_paramsc                     ddl m} |j                  dd      }|j                  dd      } ||      }|j                  d      }|r|j                  |	      }t	        |      S )
zd
        Construct the backend websocket URL with all query parameters (including 'model').
        r   )URLzhttps://zwss://zhttp://r   z/v1/realtime)path)params)httpxr$   replace	copy_withstr)r   r!   r"   r$   r   s        r   _construct_urlzOpenAIRealtime._construct_urlK   s`     	##J9##Iw7(mmmm0--|-4C3xr   Nmodel	websocketlogging_objclienttimeoutuser_api_key_dictlitellm_metadatakwargsc           
        K   dd l }ddlm} || j                         }|t	        d      |d|i}| j                  ||      }	 | j                  |      }| j                  |      }|j                  d |||d|id       |j                  ||t        |      4 d {   }t        |t        ||      ||	d	|
xs i i
      }|j                          d {    d d d       d {    y 7 M7 7 	# 1 d {  7  sw Y   y xY w# |j                  j                  $ r9}|j!                  |j"                  t%        |             d {  7   Y d }~y d }~wt&        $ rx}	 |j!                  ddt%        |              d {  7   nD# t(        $ r3}dt%        |      v sdt%        |      v rnt'        d|       Y d }~nd }~ww xY wY d }~y Y d }~y d }~ww xY ww)Nr   )ClientConnectionz-api_key is required for OpenAI realtime callsr,   r"   )r!   headerscomplete_input_dict)inputr   additional_args)additional_headersmax_sizesslr2   )r1   request_data)codereasoni  zInternal server error: zalready completedzwebsocket.closez*Unexpected error while closing WebSocket: )
websocketswebsockets.asyncio.clientr5   r   
ValueErrorr+   r    r   pre_callconnectr   r
   r   bidirectional_forward
exceptionsInvalidStatusCodeclosestatus_coder*   	ExceptionRuntimeError)r   r,   r-   r.   r!   r   r/   r0   r"   r1   r2   r3   r@   r5   r   r   r6   
backend_wsrealtime_streamingeclose_errors                        r   async_realtimezOpenAIRealtime.async_realtime[   s     	>113H?LMM #U+L!!(L91	--c2J 227;G    #&,:L+I! !  "))#*B	 *  
 %6):6&7"46F6L"!M&" )>>@@@   A    $$66 	E//q}}SV/DDD 	oo(?Ax&H &      
&#k*::>OSVT ?  $D[MR  

 	s   AGAD C,D "4C2C.C2D &C0'D +G,D .C20D 2D8C;9D D GD G )E	E
EGG!"F
FF
	G
	G)G<GGG	
GGG)NNNNNNN)__name__
__module____qualname____doc__r*   r   dictr   r   r    r   r+   LiteLLMLoggingr   floatrP   r   r   r   r   r      s   )s )
s 
t 
 3 3 0s :M RU * #'!% $#'6:+/+/LL L $	L
 3-L #L L %L 23L $C=L #4.L Lr   r   N)rT   typingr   r   r   litellm.constantsr   litellm.types.realtimer   "litellm_core_utils.litellm_loggingr	   rV   %litellm_core_utils.realtime_streamingr
   llms.custom_httpx.http_handlerr   openair   r   r   r   r   <module>r_      s3    ' & G 6 L G N )U) Ur   