o
    ưi                     @   s   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 dedefddZG dd deZdS )z
This file contains the calling Azure OpenAI's `/openai/realtime` endpoint.

This requires websockets, and is currently only supported on LiteLLM Proxy.
    )AnyOptionalcast)verbose_proxy_logger))REALTIME_WEBSOCKET_MAX_MESSAGE_SIZE_BYTES   )Logging)RealTimeStreaming)get_shared_realtime_ssl_context   )AzureChatCompletion	client_ws
backend_wsc                    sF   dd l }z	 | I d H }| |I d H  q |jjy"   Y d S w )Nr   )
websocketsrecvZ	send_text
exceptionsZConnectionClosed)r   r   r   message r   Z/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/azure/realtime/handler.pyforward_messages   s   r   c                   @   s   e Zd Z	ddededee de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e dee	 fddZ
dS )AzureOpenAIRealtimeNapi_basemodelapi_versionrealtime_protocolreturnc                 C   sV   | dd}|duo| dv }|rd}| | d| S d}| | d| d	| S )
a  
        Construct Azure realtime WebSocket URL.

        Args:
            api_base: Azure API base URL (will be converted from https:// to wss://)
            model: Model deployment name
            api_version: Azure API version
            realtime_protocol: Protocol version to use:
                - "GA" or "v1": Uses /openai/v1/realtime (GA path)
                - "beta" or None: Uses /openai/realtime (beta path, default)

        Returns:
            WebSocket URL string

        Examples:
            beta/default: "wss://.../openai/realtime?api-version=2024-10-01-preview&deployment=gpt-4o-realtime-preview"
            GA/v1:        "wss://.../openai/v1/realtime?model=gpt-realtime-deployment"
        zhttps://zwss://NZGAZV1z/openai/v1/realtimez?model=z/openai/realtimez?api-version=z&deployment=)replaceupper)selfr   r   r   r   Z_is_gapathr   r   r   _construct_url    s   z"AzureOpenAIRealtime._construct_url	websocketlogging_objapi_keyazure_ad_tokenclienttimeoutuser_api_key_dictlitellm_metadatac              
      sF  dd l }ddlm} |d u rtd|d u r%|
d u s!|
 dvr%td| j||||
d}zDt }|j|d|it|d4 I d H $}t	|t
||||d	|pNi id
}| I d H  W d   I d H  W d S 1 I d H skw   Y  W d S  |jjy } z|j|jt|dI d H  W Y d }~d S d }~w ty   td Y d S w )Nr   )ClientConnectionz+api_base is required for Azure OpenAI callsr   z.api_version is required for Azure OpenAI calls)r   zapi-key)Zadditional_headersmax_sizesslr)   )r(   Zrequest_data)codereasonz+Error in AzureOpenAIRealtime.async_realtime)r   Zwebsockets.asyncio.clientr*   
ValueErrorr   r!   r
   connectr   r	   r   Zbidirectional_forwardr   ZInvalidStatusCodeclosestatus_codestr	Exceptionr   	exception)r   r   r"   r#   r   r$   r   r%   r&   r'   r   r(   r)   r   r*   urlssl_contextr   Zrealtime_streaminger   r   r   async_realtimeE   sH   
2(
z"AzureOpenAIRealtime.async_realtime)N)	NNNNNNNNN)__name__
__module____qualname__r3   r   r!   r   LiteLLMLoggingfloatdictr9   r   r   r   r   r      s^    
*	
r   N)__doc__typingr   r   r   Zlitellm._loggingr   Zlitellm.constantsr   Z"litellm_core_utils.litellm_loggingr   r=   Z%litellm_core_utils.realtime_streamingr	   Zllms.custom_httpx.http_handlerr
   Zazurer   r   r   r   r   r   r   <module>   s    