Ë
    uPêj  ã                   ó²   — d Z ddlmZ ddlmZ ddlmZmZmZ ddl	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„Z G d„ de«      Zy)z™
This file contains the calling Azure OpenAI's `/openai/realtime` endpoint.

This requires websockets, and is currently only supported on LiteLLM Proxy.
é    )ÚMapping)ÚMappingProxyType)ÚAnyÚFinalÚcast)Ú_redact_stringÚverbose_proxy_logger)Ú)REALTIME_WEBSOCKET_MAX_MESSAGE_SIZE_BYTES)ÚRealtimeQueryParamsé   )ÚLogging)ÚRealTimeStreaming)Úget_shared_realtime_ssl_contexté   )ÚAzureChatCompletionÚ	client_wsÚ
backend_wsc              ƒ   óÀ   K  — dd l }	 	 |j                  «       ƒ d {  –—† }| j                  |«      ƒ d {  –—†  Œ27 Œ7 Œ# |j                  j                  $ r Y y w xY w­w)Nr   )Ú
websocketsÚrecvÚ	send_textÚ
exceptionsÚConnectionClosed)r   r   r   Úmessages       úh/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/azure/realtime/handler.pyÚforward_messagesr      s]   è ø€ ÛðØØ&ŸO™OÓ-×-ˆGØ×%Ñ% gÓ.×.Ð.ð Ø-øØ.ùØ× Ñ ×1Ñ1ò Ùðüs4   ‚Aˆ? œ;�? µ=¶? ½? ¿AÁAÁAÁAc                   ó  — e Zd Zededz  dedz  deeef   fd„«       Z	 	 ddedededz  d	edz  d
edz  defd„Z	 	 	 	 	 	 	 	 	 	 ddede	de
dedz  dedz  dedz  dedz  de	dz  dedz  d	edz  d
edz  de	dz  dedz  fd„Zy)ÚAzureOpenAIRealtimeÚapi_keyNÚazure_ad_tokenÚreturnc                 óZ   — | rt        d| i«      S |rt        dd|› �i«      S t        d«      ‚)z¬
        Build the websocket handshake auth headers, preferring a static api-key and falling back to
        an Azure AD (Entra ID) bearer token. Never sends both.
        zapi-keyÚAuthorizationzBearer zªMissing Azure credentials for the realtime endpoint. Set an api_key, or configure Azure AD auth (azure_ad_token, tenant_id/client_id/client_secret, or a managed identity))r   Ú
ValueError©r   r    s     r   Úget_auth_headersz$AzureOpenAIRealtime.get_auth_headers#   sE   € ñ Ü# Y°Ð$8Ó9Ð9ÙÜ# _¸ÀÐ?OÐ6PÐ$QÓRÐRÜðYó
ð 	
ó    Úapi_baseÚmodelÚapi_versionÚrealtime_protocolÚquery_paramsc                 óx  — ddl m} |j                  dd«      }|duxr |j                  «       dv }|xs i j	                  d«      }|r)d}	g }
|d	k7  r.|�d
|v r(|
j                   |d
|i«      «       nd}	 |||dœ«      g}
|r|
j                   |d|i«      «       dj                  |
«      }|r	|› |	› d|› �S |› |	› �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)
            query_params: Extra query params to forward (e.g. intent=transcription).

        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"
        r   )Ú	urlencodezhttps://zwss://N©ÚGAÚV1Úintentz/openai/v1/realtimeÚtranscriptionr)   z/openai/realtime)zapi-versionÚ
deploymentú&ú?)Úurllib.parser.   ÚreplaceÚupperÚgetÚappendÚjoin)Úselfr(   r)   r*   r+   r,   r.   Ú_is_gar2   ÚpathÚquery_partsÚqss               r   Ú_construct_urlz"AzureOpenAIRealtime._construct_url2   sú   € õ6 	+à×#Ñ# J°Ó9ˆð *°Ð5ò 
Ð:K×:QÑ:QÓ:Sð X
ð ;
ˆð &Ò+¨×0Ñ0°Ó:ˆáØ(ˆDØˆKØ˜Ò(¨lÐ.BÀgÐQ]ÑF]Ø×"Ñ"¡9¨g°uÐ-=Ó#>Õ?ð &ˆDÙ$°[ÐPUÑ%VÓWÐXˆKáØ×Ñ™y¨(°FÐ);Ó<Ô=à—H‘H˜[Ó)ˆÙ+-�(�˜D˜6  2 $Ð'ÐF°h°ZÀ¸vÐ3FÐFr'   Ú	websocketÚlogging_objÚclientÚtimeoutÚuser_api_key_dictÚlitellm_metadatac              ƒ   ó.  K  — dd l }ddlm} |€t        d«      ‚|
d u xs |
j	                  «       dv}|€|rt        d«      ‚| j                  ||||
|¬«      }| j                  ||¬«      }	 t        «       }|j                  ||t        |¬«      4 ƒd {  –—† }t        |t        ||«      |||d	|xs i i||xs i j                  d
«      dk(  r|nd ¬«      }|j                  «       ƒ d {  –—†  d d d «      ƒd {  –—†  y 7 Œj7 Œ7 Œ	# 1 ƒd {  –—†7  sw Y   y xY w# |j                  j                  $ rB}|j!                  |j"                  t%        t'        |«      «      ¬«      ƒ d {  –—†7   Y d }~y d }~wt(        $ r t+        j,                  d«       Y y w xY w­w)Nr   )ÚClientConnectionz+api_base is required for Azure OpenAI callsr/   z.api_version is required for Azure OpenAI calls)r+   r,   r%   )Úadditional_headersÚmax_sizeÚsslrH   r2   r3   )r)   rG   Úrequest_dataÚbackend_uses_beta_protocolÚforce_transcription_model)ÚcodeÚreasonz+Error in AzureOpenAIRealtime.async_realtime)r   Úwebsockets.asyncio.clientrJ   r$   r9   rB   r&   r   Úconnectr
   r   r   r:   Úbidirectional_forwardr   ÚInvalidStatusCodeÚcloseÚstatus_coder   ÚstrÚ	Exceptionr	   Ú	exception)r=   r)   rC   rD   r(   r   r*   r    rE   rF   r+   r,   rG   rH   r   rJ   rO   ÚurlÚauth_headersÚssl_contextr   Úrealtime_streamingÚes                          r   Úasync_realtimez"AzureOpenAIRealtime.async_realtimeh   sÁ  è ø€ ó  	Ý>àÐÜÐJÓKÐKØ,=ÀÐ,EÒ,vÐIZ×I`ÑI`ÓIbÐjvÐIvÐ"ØÐÑ#=ÜÐMÓNÐNà×(Ñ(ØØØØ/Ø%ð )ó 
ˆð #×3Ñ3¸GÐTbÐ3Ócˆð	ZÜ!@Ó!BˆKØ!×)Ñ)ØØ#/ÜBØð	 *ó ÷ Að Að
 Ü,=ØÜÐ)¨:Ó6ØØØ&7Ø"4Ð6FÒ6LÈ"Ð!MØ/Ià".Ò"4°"×!9Ñ!9¸(Ó!CÀÒ!V™Ð\`ô-Ð"ð )×>Ñ>Ó@×@Ð@÷%A÷ Añ Aøð$ Aøð%Aø÷ A÷ Añ Aûð( ×$Ñ$×6Ñ6ò 	UØ—/‘/ q§}¡}¼^ÌCÐPQËFÓ=S�/ÓT×TÖTûÜò 	ZÜ ×*Ñ*Ð+XÖYð	Züs¯   ‚A(FÁ+'D ÂC=ÂD ÂADÃ'C?Ã(DÃ,D Ã7DÃ8D Ã<FÃ=D Ã?DÄD ÄDÄ	DÄ
DÄD ÄFÄD ÄFÄ12E.Å#E&Å$E.Å)FÅ.!FÆFÆFÆF)NN)
NNNNNNNNNN)Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodrY   r   r&   r   rB   r   ÚLiteLLMLoggingÚfloatÚdictra   © r'   r   r   r   "   su  „ Øð
 #¨¡*ð 
¸cÀD¹jð 
ÈWÐUXÐZ]ÐU]ÑM^ò 
ó ð
ð& )-Ø37ñ4Gàð4Gð ð4Gð ˜4‘Zð	4Gð
  ™:ð4Gð *¨DÑ0ð4Gð 
ó4Gðv  $Ø"Ø"&Ø%)Ø!Ø $Ø(,Ø37Ø(,Ø(,ñ<Zàð<Zð ð<Zð $ð	<Zð
 ˜‘*ð<Zð �t‘ð<Zð ˜4‘Zð<Zð ˜d™
ð<Zð �d‘
ð<Zð ˜‘ð<Zð  ™:ð<Zð *¨DÑ0ð<Zð  ™:ð<Zð  ™+ô<Zr'   r   N)Ú__doc__Úcollections.abcr   Útypesr   Útypingr   r   r   Úlitellm._loggingr   r	   Úlitellm.constantsr
   Úlitellm.types.realtimer   Ú"litellm_core_utils.litellm_loggingr   rf   Ú%litellm_core_utils.realtime_streamingr   Úllms.custom_httpx.http_handlerr   Úazurer   r   r   ri   r'   r   ú<module>ru      sQ   ðñõ $Ý "ß #Ñ #ç AÝ GÝ 6å LÝ GÝ NÝ 'ð
 cð °só ôBZÐ-õ BZr'   