o
    ưi                     @   st   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 deZdS )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                   @   s   e Zd ZdZdefddZdedefddZdedefd	d
Z	dede
defd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dZdS )OpenAIRealtimeaH  
    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                 C   s   dS )z
        Get the default API base URL for this provider.
        Override this in subclasses to set provider-specific defaults.
        zhttps://api.openai.com/ )selfr   r   [/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/openai/realtime/handler.py_get_default_api_base   s   z$OpenAIRealtime._get_default_api_baseapi_keyc                 C   s   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   r   r   r   _get_additional_headers#   s   z&OpenAIRealtime._get_additional_headersurlc                 C   s$   | drdS t }|du rdS |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_configr   r   r   _get_ssl_config3   s   
zOpenAIRealtime._get_ssl_configapi_basequery_paramsc                 C   sP   ddl m} |dd}|dd}||}|jdd}|r$|j|d	}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)Zhttpxr   replace	copy_withstr)r   r   r   r   r   r   r   r   _construct_urlK   s   zOpenAIRealtime._construct_urlNmodel	websocketlogging_objclienttimeoutuser_api_key_dictlitellm_metadatakwargsc                    s  dd l }ddlm} |d u r|  }|d u rtd|d u r#d|i}| ||}zW| |}| |}|jd |||d|idd |j	||t
|d4 I d H $}t|t||||	d	|
p\i id
}| I d H  W d   I d H  W d S 1 I d H syw   Y  W d S  |jjy } z|j|jt|dI d H  W Y d }~d S d }~w ty } zFz|jddt| dI d H  W n& ty } zdt|v sdt|v rntd| W Y d }~nd }~ww W Y d }~d S W Y d }~d S d }~ww )Nr   )ClientConnectionz-api_key is required for OpenAI realtime callsr$   r   )r   headersZcomplete_input_dict)inputr   Zadditional_args)Zadditional_headersmax_sizesslr*   )r)   Zrequest_data)codereasoni  zInternal server error: zalready completedzwebsocket.closez*Unexpected error while closing WebSocket: )
websocketsZwebsockets.asyncio.clientr,   r   
ValueErrorr#   r   r   Zpre_callconnectr   r	   r   Zbidirectional_forward
exceptionsZInvalidStatusCodeclosestatus_coder"   	ExceptionRuntimeError)r   r$   r%   r&   r   r   r'   r(   r   r)   r*   r+   r3   r,   r   r   r-   Z
backend_wsZrealtime_streamingeZclose_errorr   r   r   async_realtime[   sx   

	
2(zOpenAIRealtime.async_realtime)NNNNNNN)__name__
__module____qualname____doc__r"   r   dictr   r   r   r   r#   LiteLLMLoggingr   floatr<   r   r   r   r   r      sH    		
r   N)r@   typingr   r   r   Zlitellm.constantsr   Zlitellm.types.realtimer   Z"litellm_core_utils.litellm_loggingr   rB   Z%litellm_core_utils.realtime_streamingr	   Zllms.custom_httpx.http_handlerr
   Zopenair   r   r   r   r   r   <module>   s    