Ë
    uPêj‰3 ã                   óÜ  — U d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
 ddl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dlmZmZmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z= ddl>m?Z?m@Z@ e#j‚                  e#j„                  e#j†                  e#j†                  e1jˆ                  dœZEe	eFeGe#e1z  f      eHd<   eED � ch c]  } | j“                  dd«      d   ’Œ c} ZJe	eK   eHd<    eLh d£«      ZMe	eLeG      eHd<   deNdeeGeNf   dz  fd„ZOdZPe	eHd<   dZQe	eHd <   d!ZRe	eHd"<   d#eGdeSfd$„ZT G d%„ d&e«      ZUyc c} w )'zJ
This file contains the transformation logic for the Gemini realtime API.
é    N)ÚOrderedDict)ÚMappingÚSequence)ÚAnyÚFinalÚcast)Úverbose_logger)Úuuid)ÚLogging)ÚBaseRealtimeConfig©ÚVertexGeminiConfig)Ú LiteLLMCompletionResponsesConfig)ÚAutomaticActivityDetectionÚ BidiGenerateContentRealtimeInputÚ&BidiGenerateContentRealtimeInputConfigÚ BidiGenerateContentServerContentÚ BidiGenerateContentServerMessageÚBidiGenerateContentSetup)ÚOpenAIRealtimeContentPartDoneÚOpenAIRealtimeDoneEventÚOpenAIRealtimeEventsÚOpenAIRealtimeEventTypesÚ'OpenAIRealtimeFunctionCallArgumentsDoneÚOpenAIRealtimeOutputItemDoneÚOpenAIRealtimeResponseAudioDoneÚ&OpenAIRealtimeResponseContentPartAddedÚOpenAIRealtimeResponseDeltaÚ OpenAIRealtimeResponseDoneObjectÚOpenAIRealtimeResponseTextDoneÚ&OpenAIRealtimeStreamResponseBaseObjectÚ&OpenAIRealtimeStreamResponseOutputItemÚ+OpenAIRealtimeStreamResponseOutputItemAddedÚOpenAIRealtimeStreamSessionÚ!OpenAIRealtimeStreamSessionEventsÚOpenAIRealtimeTurnDetectionÚResponsesAPIStreamEvents)ÚGeminiResponseModalitiesÚHttpxBlobTypeÚHttpxContentType)ÚALL_DELTA_TYPESÚ$RealtimeInputAudioTranscriptionUsageÚ'RealtimeModalityResponseTransformOutputÚRealtimeResponseTransformInputÚRealtimeResponseTypedDict)Úget_empty_usageé   )Úencode_unserializable_typesÚget_api_key_from_env)ÚsetupCompletez serverContent.generationCompletezserverContent.turnCompletezserverContent.interruptedÚtoolCallÚ MAP_GEMINI_FIELD_TO_OPENAI_EVENTú.é   Ú_KNOWN_GEMINI_TOP_LEVEL_KEYS>
   ÚashÚechoÚsageÚalloyÚcedarÚcoralÚmarinÚverseÚballadÚshimmerÚOPENAI_STOCK_REALTIME_VOICESÚvoiceÚreturnc                 ó²   — t        | t        «      r-| j                  «       t        v rt	        j
                  d| «       yt        «       j                  d| i«      S )a/  Build the Gemini Live speechConfig for a client-requested voice.

    OpenAI stock voice names have no Gemini equivalent and Gemini Live closes
    the session on an unknown voice, so they are dropped with a warning and
    the model keeps its default voice. Every other name is forwarded verbatim.
    zƒGemini Realtime: voice %s is an OpenAI voice with no Gemini equivalent; dropping it so the session keeps the model's default voice.NrE   )Ú
isinstanceÚstrÚlowerrD   r	   Úwarningr   Ú_map_audio_params)rE   s    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/gemini/realtime/transformation.pyÚ_gemini_live_speech_configrN   R   sQ   € ô �%œÔ %§+¡+£-Ô3OÑ"OÜ×ÑðJàô	
ð
 ÜÓ×1Ñ1°7¸EÐ2BÓCÐCó    é   Ú.GEMINI_LIVE_TRANSCRIBE_AUDIO_TOKENS_PER_SECONDé¯   Ú4GEMINI_LIVE_TRANSCRIBE_OUTPUT_TEXT_TOKENS_PER_MINUTEi€»  Ú"PCM16_INPUT_AUDIO_BYTES_PER_SECONDÚdatac                 óŽ   — | j                  d«      rdn| j                  d«      rdnd}t        t        | «      dz  dz  |z
  d«      S )Nz==r1   ú=r8   r   é   é   )ÚendswithÚmaxÚlen)rU   Úpaddings     rM   Ú_base64_decoded_byte_countr^   j   sA   € ØŸ-™-¨Ô-‘Q¸¿¹ÀcÔ8J±1ÐPQ€GÜŒs�4‹y˜1‰} Ñ! GÑ+¨QÓ/Ð/rO   c                   óà  ‡ — e Zd ZdZˆ fd„Zdedefd„Zdedefd„Zdefd„Z	e
ded	eeef   deeef   fd
„«       Ze
deeef   deeef   fd„«       Zdadedededz  defd„Zdadedz  dededz  defd„Zdedefd„Zdedz  defd„Zdbdefd„Zdedz  defd„Zdedz  dee   fd„Zdedefd„Zdedee   fd„Zd ed!edefd"„Ze
d#ededz  fd$„«       Z e
d#edefd%„«       Z!e
dedefd&„«       Z"e
dedefd'„«       Z#e
dedefd(„«       Z$e
dede%fd)„«       Z&e
ded*e'e   de(ed+f   fd,„«       Z)e
ded-eeef   deeef   fd.„«       Z*d/edededz  dee   fd0„Z+d/edee   fd1„Z,d2edee   fd3„Z-d2edee   fd4„Z.	 dad5edededz  dee   fd6„Z/	 daded7ededz  de0fd8„Z1	 dad9ee2   dz  defd:„Z3	 dad;ed<ed=edededz  dee2   fd>„Z4d5e5d<ed;edede6f
d?„Z7d@ee6   dz  dAedz  dBedz  dede8e9z  f
dC„Z:dAedz  dBedz  dDe8e9z  dedee2   f
dE„Z;dFededz  fdG„Z<	 	 dcdHed;edz  d<edz  dee=   fdI„Z>e
dJedKedefdL„«       Z?dMe2ee2   z  dNee6   dz  dee6   dz  fdO„Z@dMe2ee2   z  dPeeA   dz  deeA   dz  fdQ„ZB	 dad5eCdBedz  dRedz  dSeeA   dz  dedz  deDfdT„ZEdUed/edVeFdedeGf
dW„ZHdXededYedz  deeIz  fdZ„ZJdedeKdz  fd[„ZLdedeKdz  fd\„ZMd5eeNz  ded]eOdVeFdePf
d^„ZQdefd_„ZRdedefd`„ZSˆ xZTS )dÚGeminiRealtimeConfigé   c                 ó\   •— t         ‰| �  «        t        «       | _        d | _        d| _        y )Nr   )ÚsuperÚ__init__r   Ú_tool_call_id_to_nameÚ_pending_usage_metadataÚ_unbilled_input_audio_bytes)ÚselfÚ	__class__s    €rM   rd   zGeminiRealtimeConfig.__init__r   s*   ø€ Ü‰ÑÔÜ<G»MˆÔ"ð 59ˆÔ$Ø01ˆÕ(rO   Úmsg_objrF   c                 ó
   — d|v S )NÚsetup© ©rh   rj   s     rM   Úis_setup_messagez%GeminiRealtimeConfig.is_setup_messagez   s   € Ø˜'Ð!Ð!rO   c                 ó,   ‡— t        ˆfd„dD «       «      S )Nc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nrm   )Ú.0Úkrj   s     €rM   ú	<genexpr>z:GeminiRealtimeConfig.is_content_message.<locals>.<genexpr>~   s   øè ø€ Ò\ A�1˜”<Ñ\ùó   ƒ)ÚrealtimeInputÚclientContentÚtoolResponse)Úanyrn   s    `rM   Úis_content_messagez'GeminiRealtimeConfig.is_content_message}   s   ø€ ÜÓ\Ð)[Ô\Ó\Ð\rO   c                  ó   — y)zWGoogle AI Studio Gemini 3.5+ accepts ``id`` on functionResponses; Vertex AI rejects it.Trm   ©rh   s    rM   Ú_include_function_response_idz2GeminiRealtimeConfig._include_function_response_id€   s   € àrO   ÚdetailsÚdefaultsc                 óš   — t        | t        «      st        |«      S i |¥| j                  «       D ��ci c]  \  }}|€Œ	||“Œ c}}¥S c c}}w rr   )rH   ÚdictÚitems)r   r€   ÚkeyÚvalues       rM   Ú_usage_detail_aliasz(GeminiRealtimeConfig._usage_detail_alias„   sQ   € ä˜'¤4Ô(Ü˜“>Ð!ð
Øð
à,3¯M©M«O×Q™j˜c 5¸uÑ?Pˆs�E‰zÓQð
ð 	
ùãQs
   ²
A½AÚ
usage_dictc           
      óè   — | j                  dt        j                  | j                  d«      ddddœ«      «       | j                  dt        j                  | j                  d«      dddœ«      «       | S )NÚinput_token_detailsÚinput_tokens_detailsr   )Úcached_tokensÚtext_tokensÚaudio_tokensÚoutput_token_detailsÚoutput_tokens_details©rŒ   r�   )Ú
setdefaultr`   r†   Úget)r‡   s    rM   Ú!_add_pipecat_usage_detail_aliasesz6GeminiRealtimeConfig._add_pipecat_usage_detail_aliases�   sv   € à×ÑØ!Ü ×4Ñ4Ø—‘Ð5Ó6Ø"#°AÀqÑIóô	
ð 	×ÑØ"Ü ×4Ñ4Ø—‘Ð6Ó7Ø !°1Ñ5óô	
ð ÐrO   NÚheadersÚmodelÚapi_keyc                 ó   — |S rr   rm   )rh   r”   r•   r–   s       rM   Úvalidate_environmentz)GeminiRealtimeConfig.validate_environmentŸ   s   € ØˆrO   Úapi_basec                 ó’   — |€d}|€
t        «       }|€t        d«      ‚|j                  dd«      }|j                  dd«      }|› d|› �S )z´
        Example output:
        "BACKEND_WS_URL = "wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent"";
        z'wss://generativelanguage.googleapis.comz(api_key is required for Gemini API callszhttps://zwss://zhttp://zws://zR/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=)r3   Ú
ValueErrorÚreplace)rh   r™   r•   r–   s       rM   Úget_complete_urlz%GeminiRealtimeConfig.get_complete_url¢   sg   € ð
 ÐØ@ˆHØˆ?Ü*Ó,ˆGØˆ?ÜÐGÓHÐHØ×#Ñ# J°Ó9ˆØ×#Ñ# I¨wÓ7ˆð
 �ÐmÐnuÐmvÐwÐwrO   Ú
model_turnc                 ó   — d|v rm|d   }t        |«      dk7  rt        j                  dt        |«      «       |d   }d|v rt        j                  S d|v rt        j
                  S t        d|› �«      ‚t        d|› �«      ‚)	aO  
        Map the model turn event to the OpenAI realtime events.

        Returns either:
        - response.text.delta - model_turn: {"parts": [{"text": "..."}]}
        - response.audio.delta - model_turn: {"parts": [{"inlineData": {"mimeType": "audio/pcm", "data": "..."}}]}

        Assumes parts is a single element list.
        Úpartsr8   z>Realtime: Expected 1 part, got %s for Gemini model turn event.r   ÚtextÚ
inlineDatazUnexpected part type: z-Unexpected model turn event, no 'parts' key: )r\   r	   rK   r   ÚRESPONSE_TEXT_DELTAÚRESPONSE_AUDIO_DELTAr›   )rh   rž   r    Úparts       rM   Úmap_model_turn_eventz)GeminiRealtimeConfig.map_model_turn_eventµ   s�   € ð �jÑ Ø% gÑ.ˆEÜ�5‹z˜QŠÜ×&Ñ&Ð'gÔilÐmrÓisÔtØ ™(ˆDØ˜‰~Ü/×CÑCÐCØ Ñ%Ü/×DÑDÐDä Ð#9¸$¸Ð!@ÓAÐAÜÐHÈÈÐUÓVÐVrO   Ú
delta_typec                 ór   — |dk(  rt         j                  S |dk(  rt         j                  S t        d|› �«      ‚)Nr¡   ÚaudiozUnexpected delta type: )r   ÚRESPONSE_TEXT_DONEÚRESPONSE_AUDIO_DONEr›   )rh   r§   s     rM   Úmap_generation_complete_eventz2GeminiRealtimeConfig.map_generation_complete_eventÌ   s=   € Ø˜ÒÜ+×>Ñ>Ð>Ø˜7Ò"Ü+×?Ñ?Ð?äÐ6°z°lÐCÓDÐDrO   Úinput_audio_formatc                 ó2   — ddddœ}|j                  |d«      S )Nzaudio/pcm;rate=24000z
audio/pcmuz
audio/pcma)Úpcm16Ú	g711_ulawÚ	g711_alawzapplication/octet-stream©r’   )rh   r­   Ú
mime_typess      rM   Úget_audio_mime_typez(GeminiRealtimeConfig.get_audio_mime_typeÔ   s'   € à+Ø%Ø%ñ
ˆ
ð �~‰~Ð0Ð2LÓMÐMrO   Úsession_configuration_requestc                 ó*  — |sy	 t        j                  |«      j                  di «      }|j                  di «      j                  di «      }t        |t        «      xr |j                  d«      du S # t         j
                  t        t        f$ r Y yw xY w)NFrl   ÚrealtimeInputConfigÚautomaticActivityDetectionÚdisabledT)ÚjsonÚloadsr’   rH   r‚   ÚJSONDecodeErrorÚ	TypeErrorÚAttributeError)rh   rµ   rl   Úautomatic_detections       rM   Ú_manual_turn_detection_enabledz3GeminiRealtimeConfig._manual_turn_detection_enabledÝ   s�   € Ù,Øð	ÜŸ:™:Ð&CÓD×HÑHÈÐRTÓUˆEØ).¯©Ð3HÈ"Ó)M×)QÑ)QÐRnÐprÓ)sÐÜÐ1´4Ó8ÒhÐ=P×=TÑ=TÐU_Ó=`ÐdhÐ=hÐhøÜ×$Ñ$¤i´Ð@ò 	Ùð	ús   …A+A1 Á1BÂBc                 óº   — | j                  |«      rddi}t        j                  d«       nddi}t        j                  d«       t        j                  d|i«      gS )zBMap OpenAI buffer commit/end to Gemini Live turn-boundary signals.ÚactivityEndTz=Gemini Realtime: Sending activityEnd realtimeInput to backendÚaudioStreamEndz@Gemini Realtime: Sending audioStreamEnd realtimeInput to backendrw   )rÀ   r	   Údebugrº   Údumps)rh   rµ   Úrealtime_input_dicts      rM   Ú(_handle_input_audio_buffer_commit_or_endz=GeminiRealtimeConfig._handle_input_audio_buffer_commit_or_endç   sb   € à×.Ñ.Ð/LÔMà˜tðEÐô × Ñ Ð!`Õaà#3°TÐ":ÐÜ× Ñ Ð!cÔdÜ—
‘
˜OÐ-@ÐAÓBÐCÐCrO   r…   c                 óš  — t        |t        «      r"|j                  d«      dk(  rd|vr
t        «       S t        «       }d|v rt        |d   t        «      r
|d    |d<   n/t        |t        «      r|j                  d«      dk(  rd|d<   nd|d<   d|v rt        |d   t
        «      r|d   |d	<   d
|v rt        |d
   t
        «      r|d
   |d<   |S )u  Map OpenAI ``server_vad`` to Gemini ``automaticActivityDetection``.

        OpenAI ``semantic_vad`` has no Gemini Live equivalent â€” return an empty
        dict so callers omit ``realtimeInputConfig`` (mapping it with
        ``disabled: true`` breaks native-audio sessions).
        ÚtypeÚsemantic_vadÚcreate_responser¹   Ú
server_vadFTÚprefix_padding_msÚprefixPaddingMsÚsilence_duration_msÚsilenceDurationMs)rH   r‚   r’   r   ÚboolÚint)rh   r…   Úautomatic_activity_dections      rM   Úmap_automatic_turn_detectionz1GeminiRealtimeConfig.map_automatic_turn_detectionó   sî   € ô �eœTÔ" u§y¡y°Ó'8¸NÒ'JÐO`ÐhmÑOmÜ-Ó/Ð/ä,FÓ,HÐ"Ø Ñ%¬*°UÐ;LÑ5MÌtÔ*TØ9>Ð?PÑ9QÐ5QÐ& zÒ2Ü˜œtÔ$¨¯©°6Ó):¸lÒ)Jà5:Ð& zÒ2à59Ð& zÑ2Ø %Ñ'¬J°uÐ=PÑ7QÔSVÔ,WØ<AÐBUÑ<VÐ&Ð'8Ñ9Ø  EÑ)¬j¸Ð?TÑ9UÔWZÔ.[Ø>CÐDYÑ>ZÐ&Ð':Ñ;Ø)Ð)rO   c                 ó
   — g d¢S )N)ÚinstructionsÚtemperatureÚmax_response_output_tokensÚ
modalitiesÚtoolsÚinput_audio_transcriptionÚturn_detectionrE   rm   ©rh   r•   s     rM   Úget_supported_openai_paramsz0GeminiRealtimeConfig.get_supported_openai_params  s   € ò	
ð 		
rO   Úoptional_paramsÚnon_default_paramsc                 óò  — d|vri |d<   |j                  «       D �]2  \  }}|dk(  rt        dd|ig¬«      |d<   Œ |dk(  r	||d   d<   Œ.|dk(  r	||d   d	<   Œ<|d
k(  r:t        t        t           |«      D �cg c]  }|j                  «       ‘Œ c}|d   d<   Œ{|dk(  r$ddlm}  |«       }|j                  ||¬«      |d<   Œ¤|dk(  r|�i |d<   Œ±|dk(  r_t        t        |«      }t        |t        «      r|j                  d«      dk(  rd|vrŒï| j                  |«      }	|	s�Œt        |	¬«      |d<   �Œ|dk(  s�Œt        |«      }
|
s�Œ+|
|d   d<   �Œ5 t!        |d   «      dk(  r|j#                  d«       |S c c}w )NÚgenerationConfigrÖ   Úuserr¡   ©Úroler    ÚsystemInstructionr×   rØ   ÚmaxOutputTokensrÙ   ÚresponseModalitiesrÚ   r   r   )r…   rß   rÛ   ÚinputAudioTranscriptionrÜ   rÉ   rÊ   rË   )r¸   r·   rE   ÚspeechConfig)rƒ   r*   r   ÚlistrI   ÚupperÚ@litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_geminir   Ú_map_functionr&   rH   r‚   r’   rÔ   r   rN   r\   Úpop)rh   rß   rà   r„   r…   Úmodalityr   Úvertex_gemini_configÚvalue_typedÚ!transformed_audio_activity_configÚspeech_configs              rM   Úmap_openai_paramsz&GeminiRealtimeConfig.map_openai_params  sÙ  € Ø _Ñ4Ø24ˆOÐ.Ñ/Ø,×2Ñ2Ó4ó *	X‰JˆC�Ø�nÒ$Ü7GÈVÐ]cÐejÐ\kÐ[lÔ7m�Ð 3Ò4Ø˜Ò%ØEJ�Ð 2Ñ3°MÒBØÐ4Ò4ØIN�Ð 2Ñ3Ð4EÒFØ˜Ò$ä59¼$¼s¹)ÀUÓ5KöMØ)1�H—N‘NÕ$òM�Ð 2Ñ3Ð4HÒIð ˜’õñ (:Ó';Ð$à+?×+MÑ+MØ°ð ,Nó ,� Ò(ð Ð3Ò3¸Ð8IØ=?�Ð 9Ò:ØÐ(Ò(Ü"Ô#>ÀÓF�ä˜{¬DÔ1Ø#Ÿ™¨Ó/°>ÒAØ)°Ñ<ð
 Ø48×4UÑ4UÐVaÓ4bÐ1Û4Ü=cØ3Tô>�OÐ$9Ó:ð ˜”Ü :¸5Ó A�Û ØJW�OÐ$6Ñ7¸ÓGðU*	XôV ˆÐ1Ñ2Ó3°qÒ8Ø×ÑÐ 2Ô3ØÐùòKMs   Á4E4Úsessionc                 ó6  — t        | t        «      sy| j                  d«      }t        |t        «      r|S | j                  d«      }t        |t        «      rD|j                  d«      }t        |t        «      r#|j                  d«      }t        |t        «      r|S y)zÈExtract turn_detection from a session.update payload.

        Handles both the flat beta shape (``session.turn_detection``) and the
        GA shape (``session.audio.input.turn_detection``).
        NrÜ   r©   Úinput)rH   r‚   r’   )rö   Útdr©   Ú	input_cfgs       rM   Ú_extract_turn_detectionz,GeminiRealtimeConfig._extract_turn_detectionI  s€   € ô ˜'¤4Ô(ØØ�[‰[Ð)Ó*ˆÜ�bœ$ÔØˆIØ—{‘{ 7Ó+ˆÜ�eœTÔ"Ø$Ÿy™y¨Ó1ˆIÜ˜)¤TÔ*Ø—]‘]Ð#3Ó4�Ü˜b¤$Ô'Ø�IØrO   c                 óî  — t        | t        «      s| S t        | «      }d|vrd|v r|d   |d<   |j                  d«      }t        |t        «      rk|j                  d«      }t        |t        «      rd|vrd|v r|d   |d<   |j                  d«      }t        |t        «      r|j                  d«      r|d   |d<   t        j	                  |«      }|�$t        |j                  d	«      t        «      s||d	<   |S )
aŒ  Normalize GA-remapped session fields back to their beta keys.

        ``map_openai_params`` only recognises the flat OpenAI-beta key names
        (``modalities``, ``input_audio_transcription``, ``turn_detection``).
        For GA clients the upstream shim renames these into the nested GA
        schema (``output_modalities``, ``audio.input.transcription``,
        ``audio.input.turn_detection``), which would otherwise be silently
        dropped here. Surface them back at the top level so the existing
        mapping logic picks them up without duplicating provider-specific
        knowledge of the GA schema in ``map_openai_params``.
        rÙ   Úoutput_modalitiesr©   rø   rÛ   ÚtranscriptionÚoutputrE   rÜ   )rH   r‚   r’   r`   rû   )rö   Ú
normalizedr©   rú   Ú
output_cfgÚextracted_turn_detections         rM   Ú&_normalize_session_payload_for_mappingz;GeminiRealtimeConfig._normalize_session_payload_for_mapping^  sû   € ô ˜'¤4Ô(ØˆNä  ›Mˆ
à˜zÑ)Ð.AÀZÑ.OØ'1Ð2EÑ'FˆJ�|Ñ$à!—~‘~ gÓ.ˆÜ�eœTÔ"Ø$Ÿy™y¨Ó1ˆIÜ˜)¤TÔ*Ø.°jÑ@À_ÐXaÑEaØ>GÈÑ>X�JÐ:Ñ;Ø %§	¡	¨(Ó 3ˆJÜ˜*¤dÔ+°
·±¸wÔ0GØ&0°Ñ&9�
˜7Ñ#ä*>×*VÑ*VÐWaÓ*bÐ Ø#Ð/¼
À:Ç>Á>ÐRbÓCcÔeiÔ8jØ+CˆJÐ'Ñ(àÐrO   c                 ó   — t         j                  j                  | «      }|€X| j                  dd«      d   }t         j                  j                  |«      xs" t         j                  j                  d|› �«      }|xs i S )Nú/r8   éÿÿÿÿzgemini/)ÚlitellmÚ
model_costr’   Úsplit)r•   ÚentryÚstrippeds      rM   Ú_model_cost_entryz&GeminiRealtimeConfig._model_cost_entryƒ  sr   € ä×"Ñ"×&Ñ& uÓ-ˆØˆ=Ø#Ÿk™k¨#¨qÓ1°"Ñ5ˆHÜ×&Ñ&×*Ñ*¨8Ó4Òd¼×8JÑ8J×8NÑ8NÐQXÐYaÐXbÐOcÓ8dˆEØŠ{˜ÐrO   c                 ó†   — t         j                  | «      }t        |j                  d«      xs |j                  d«      «      S )NÚgemini_native_audioÚgemini_audio_only_live)r`   r  rÑ   r’   )r•   r
  s     rM   Ú_is_audio_only_live_modelz.GeminiRealtimeConfig._is_audio_only_live_model‹  s6   € ä+×=Ñ=¸eÓDˆÜ�E—I‘IÐ3Ó4Ò[¸¿	¹	ÐBZÓ8[Ó\Ð\rO   c                 óP   — t         j                  | «      j                  d«      dk(  S )NÚmodeÚaudio_transcription)r`   r  r’   ©r•   s    rM   Ú_is_text_only_live_modelz-GeminiRealtimeConfig._is_text_only_live_model�  s$   € ä#×5Ñ5°eÓ<×@Ñ@ÀÓHÐLaÑaÐarO   c                 ó4   — t         j                  | «      rdS dS )NÚTEXTÚAUDIO)r`   r  r  s    rM   Ú_default_response_modalityz/GeminiRealtimeConfig._default_response_modality”  s   € ä-×FÑFÀuÔMˆvÐZÐSZÐZrO   rÙ   .c                 óæ   — t        d„ |D «       «      }t        j                  | «      rd|v rt        d„ |D «       «      xs dS t        j                  | «      rd|v rt        d„ |D «       «      xs dS |S )zšSwap responseModalities a Live model cannot produce: TEXT to AUDIO for
        audio-only models, AUDIO to TEXT for text-only ones (e.g. transcribe-live).c              3   óŽ   K  — | ]=  }t        |t        «      r|j                  «       nt        |«      j                  «       –— Œ? y ­wrr   )rH   rI   rì   ©rs   rð   s     rM   ru   zCGeminiRealtimeConfig._coerce_response_modalities.<locals>.<genexpr>œ  s7   è ø€ ò "
ØYa¤
¨8´SÔ 9ˆH�N‰NÔ¼sÀ8»}×?RÑ?RÓ?TÓTñ"
ùs   ‚AAr  c              3   ó,   K  — | ]  }|d k7  sŒ	|–— Œ y­w)r  Nrm   r  s     rM   ru   zCGeminiRealtimeConfig._coerce_response_modalities.<locals>.<genexpr>   s   è ø€ ÒS hÀÈFÓ@RœÑSùó   ‚
�)r  r  c              3   ó,   K  — | ]  }|d k7  sŒ	|–— Œ y­w)r  Nrm   r  s     rM   ru   zCGeminiRealtimeConfig._coerce_response_modalities.<locals>.<genexpr>¢  s   è ø€ ÒT hÀÈGÓ@SœÑTùr  )r  )Útupler`   r  r  )r•   rÙ   r   s      rM   Ú_coerce_response_modalitiesz0GeminiRealtimeConfig._coerce_response_modalities˜  s{   € ô "ñ "
Øeoô"
ó 
ˆ
ô  ×9Ñ9¸%Ô@ÀVÈzÑEYÜÑS°*ÔSÓSÒaÐWaÐaÜ×8Ñ8¸Ô?ÀGÈzÑDYÜÑT°*ÔTÓTÒaÐXaÐaØÐrO   rl   c                 ó¼   — |j                  d«      }t        |t        «      r:|j                  d«      }t        |t        «      rt        j                  | |«      |d<   |S )Nrâ   rè   )r’   rH   r‚   rë   r`   r!  )r•   rl   Úgeneration_configrÙ   s       rM   Ú_finalize_gemini_live_setupz0GeminiRealtimeConfig._finalize_gemini_live_setup¥  s[   € à#(§9¡9Ð-?Ó#@ÐÜÐ'¬Ô.Ø 1× 5Ñ 5Ð6JÓ KˆJÜ˜*¤dÔ+Ü:N×:jÑ:jØ˜:ó;Ð!Ð"6Ñ7ð ˆrO   Újson_messagec                 óZ  — |j                  d«      xs i }| j                  |«      }| j                  i |¬«      }|€�|j                  di «      }|j                  dt        j                  |«      g«       |j                  di «       d|› �|d<   t        j                  d«       t        j                  d	| j                  ||«      i«      gS | j                  |«      }t        |t        «      r*|j                  d
«      du rt        j                  d«       g S t        j                  d«       g S )a   
        Handle session.update by sending setup to Gemini.

        On the FIRST session.update (when session_configuration_request is None),
        the full setup with all configuration is sent. Gemini Live accepts setup
        as the first-and-only client message, so every later session.update is
        dropped rather than forwarded as a second setup (which Gemini rejects
        with a 1007, tearing the session down). To carry tools/instructions, send
        them on the first session.update before any conversation content.
        rö   )rß   rà   râ   rè   ré   úmodels/r•   z<Gemini Realtime: Sending initial setup with tools to backendrl   rË   Fuã   Gemini Realtime: Dropping subsequent session.update (turn_detection.create_response=False) â€” Gemini Live rejects a second setup message, so audio-transcription guardrails cannot suppress the model's auto-response mid-session.z=Gemini Realtime: Ignoring session.update (setup already sent))r’   r  rõ   r‘   r`   r  r	   rÄ   rº   rÅ   r$  rû   rH   r‚   rK   )rh   r%  r•   rµ   Úsession_payloadÚnew_overridesr#  Úclient_turn_detections           rM   Ú_handle_session_updatez+GeminiRealtimeConfig._handle_session_update°  s7  € ð  '×*Ñ*¨9Ó5Ò;¸ˆð ×EÑEÀoÓVˆØ#×5Ñ5ÀbÐ]lÐ5Ómˆà(Ð0Ø'4×'?Ñ'?Ð@RÐTVÓ'WÐØ×(Ñ(Ð)=Ô@T×@oÑ@oÐpuÓ@vÐ?wÔxØ×$Ñ$Ð%>ÀÔCØ'.¨u¨gÐ%6ˆM˜'Ñ"Ü× Ñ Ð!_Ô`Ü—J‘J ¨×)IÑ)IÈ%ÐQ^Ó)_Ð`ÓaÐbÐbð (,×'CÑ'CÀOÓ'TÐÜÐ+¬TÔ2Ð7L×7PÑ7PÐQbÓ7cÐglÑ7lÜ×"Ñ"ðBôð ˆ	ô × Ñ Ð!`ÔaØˆ	rO   c                 ó–   — |j                  di «      }|j                  d«      }|dk(  r| j                  |«      S | j                  |«      S )zÒ
        Handle conversation.item.create for user text or function call output.

        Converts OpenAI format to Gemini's clientContent (for user text) or
        toolResponse (for function outputs).
        ÚitemrÉ   Úfunction_call_output)r’   Ú_handle_function_call_outputÚ_handle_user_text_content)rh   r%  r-  Ú	item_types       rM   Ú_handle_conversation_itemz.GeminiRealtimeConfig._handle_conversation_itemé  sO   € ð #×&Ñ& v¨rÓ2ˆØŸ8™8 FÓ+ˆ	àÐ.Ò.Ø×4Ñ4°TÓ:Ð:Ø×-Ñ-¨dÓ3Ð3rO   r-  c                 óD  — |j                  dd«      }|j                  dd«      }t        j                  d|«       	 t        |t        «      rt        j                  |«      n|}t        |t        «      r|nd|i}| j                  j                  |«      }|r| j                  j                  |«       nt        j                  d|«       d|i}| j                  «       r|r||d	<   |r||d
<   dd|gii}t        j                  |«      gS # t
        j                  $ r |}Y Œ»w xY w)z=Transform function_call_output to Gemini toolResponse format.Úcall_idÚ rÿ   z{}zAGemini Realtime: Transforming function_call_output for call_id=%sÚresultzfGemini Realtime: Function name not found for call_id=%s. This may cause Gemini to reject the response.ÚresponseÚidÚnamery   ÚfunctionResponses)r’   r	   rÄ   rH   rI   rº   r»   r¼   r‚   re   Úmove_to_endrK   r~   rÅ   )	rh   r-  r4  rÿ   Úparsed_outputÚoutput_dictÚfunction_nameÚfunction_responseÚtool_response_messages	            rM   r/  z1GeminiRealtimeConfig._handle_function_call_output÷  s&  € àŸ™ )¨RÓ0ˆØŸ™ ¨4Ó0ˆä×ÑÐ`ÐbiÔjð	#Ü2<¸VÄSÔ2IœDŸJ™J vÔ.ÈvˆMô /9¸ÌÔ.M™]ÐT\Ð^kÐSlˆð  $×9Ñ9×=Ñ=¸gÓFˆÙØ×&Ñ&×2Ñ2°7Õ;ä×"Ñ"ØxØôð
 5?ÀÐ3LÐØ×-Ñ-Ô/±GØ&-Ð˜dÑ#ÙØ(5Ð˜fÑ%à(6Ð9LÐO`ÐNaÐ8bÐ'cÐä—
‘
Ð0Ó1Ð2Ð2øô- ×#Ñ#ò 	#Ø"ŠMð	#ús   ¼'D ÄDÄDc                 ó@  — |j                  dg «      }|D �cg c]:  }t        |t        «      sŒ|j                  d«      dk(  sŒ)|j                  dd«      ‘Œ< }}dj                  t	        d|«      «      }|sg S dd	d|igd
œgddœi}t        j                  |«      gS c c}w )z;Transform user text content to Gemini clientContent format.ÚcontentrÉ   Ú
input_textr¡   r5  ú Nrx   rã   rä   T)ÚturnsÚturnComplete)r’   rH   r‚   ÚjoinÚfilterrº   rÅ   )rh   r-  Úcontent_listÚcÚ
text_partsr¡   Úclient_content_messages          rM   r0  z.GeminiRealtimeConfig._handle_user_text_content  s­   € à"Ÿh™h y°"Ó5ˆØ1=Öw¨AÄÈAÌtÕATÐYZ×Y^ÑY^Ð_eÓYfÐjvÓYv�a—e‘e˜F BÕ'Ðwˆ
ÐwØ—h‘hœv d¨JÓ7Ó8ˆÙØˆIð Ø#)°f¸d°^Ð4DÑEÐFØ $ñð)
Ðô —
‘
Ð1Ó2Ð3Ð3ùò xs   —B­BÁBÚmessagec           
      ó8  — i }	 t        j                  |«      }g }|j                  d«      }|dk(  r| j                  |||«      S |dk(  rg S |dk(  r| j                  |«      S |d	k(  rÄ|d
   }	t        |	t        «      r| xj                  t        |	«      z  c_        t        | j                  «       |	¬«      |d
<   t        t         t#        t        t$        t        t&        f   |«      «      «      }t        j(                  d|i«      }
t+        j,                  d«       |j/                  |
«       |S |dv r| j1                  |«      S |dk(  rg S g S # t         j                  $ r> t        |t        «      r|j                  dd¬«      }nt        |«      }t        d|› �«      ‚w xY w)Núutf-8rœ   ©ÚerrorsúInvalid JSON message: rÉ   zsession.updatezresponse.createzconversation.item.createzinput_audio_buffer.appendr©   )ÚmimeTyperU   rw   z7Gemini Realtime: Sending audio realtimeInput to backend)zinput_audio_buffer.commitzinput_audio_buffer.endzinput_audio_buffer.clear)rº   r»   r¼   rH   ÚbytesÚdecoderI   r›   r’   r+  r2  rg   r^   r)   r´   r   r   r2   r‚   ÚobjectrÅ   r	   rÄ   ÚappendrÇ   )rh   rM  r•   rµ   rÆ   r%  Úmessage_strÚmessagesÚmsg_typeÚ	audio_b64Ú
gemini_msgs              rM   Útransform_realtime_requestz/GeminiRealtimeConfig.transform_realtime_request*  s«  € ð ACÐð	EÜ"&§*¡*¨WÓ"5ˆLð &(ˆØ&×*Ñ*¨6Ó2ˆàÐ'Ò'Ø×.Ñ.¨|¸UÐDaÓbÐbàÐ(Ò(ØˆIàÐ1Ò1Ø×1Ñ1°,Ó?Ð?àÐ2Ò2Ø+¨GÑ4ˆIÜ˜)¤SÔ)Ø×0Ò0Ô4NÈyÓ4YÑYÕ0Ü+8À$×BZÑBZÓB\ÐclÔ+mÐ Ñ(ä"&Ü0Ü+¬D´´c¼6°kÑ1BÐDWÓ,XÓYó#Ðô
 !%§
¡
¨OÐ=PÐ+QÓ RˆJÜ× Ñ Ð!ZÔ[Ø�O‰O˜JÔ'ØˆOàÐNÑNØ×@Ñ@ÐA^Ó_Ð_àÐ1Ò1ØˆIàˆ	øôS ×#Ñ#ò 	EÜ˜'¤5Ô)Ø%Ÿn™n¨W¸Y˜nÓG‘ä! '›l�ÜÐ5°k°]ÐCÓDÐDð	Eús   „E ÅAFÚlogging_session_idc                 ó¨  — |r&t        j                  |«      j                  di «      }ni }|j                  d«      xs |}|j                  di «      xs i }|j                  ddg«      }t        t        t
           |«      D �cg c]  }|j                  «       ‘Œ }	}|j                  d«      }
t        ||	¬«      }|
�t        |
t
        «      r|
|d<   |�Tt        |t
        «      rDd	|v r|j                  d	«      d
   |d<   n(|j                  d«      r|t        d«      d  |d<   n||d<   t        d|t        t        j                  «       «      ¬«      S c c}w )Nrl   r•   râ   rè   r  ræ   )r8  rÙ   rÖ   z/models/r  r'  zsession.created)rÉ   rö   Úevent_id)rº   r»   r’   r   rë   rI   rJ   r$   rH   r	  Ú
startswithr\   r%   r
   Úuuid4)rh   r•   r^  rµ   Ú"session_configuration_request_dictÚ_modelr#  Úgemini_modalitiesrð   Ú_modalitiesÚ_system_instructionrö   s               rM   Útransform_session_created_eventz4GeminiRealtimeConfig.transform_session_created_event^  s_  € ñ )ÜKOÏ:É:Ø-óLç‰c�'˜2Óñ /ð 24Ð.à:×>Ñ>¸wÓGÒPÈ5ˆØ#E×#IÑ#IÐJ\Ð^`Ó#aÒ#gÐegÐØ#4×#8Ñ#8Ð9MÐPWÈyÓ#YÐÜ?CÄDÌÁIÐO`Ó?aÖb°8˜hŸn™nÕ.ÐbˆÐbØ%G×%KÑ%KÐL_Ó%`ÐÜ4Ø!Ø"ô
ˆð Ð*¬zÐ:MÌsÔ/SØ&9ˆG�NÑ#ØÐ¤*¨V´SÔ"9à˜VÑ#Ø#)§<¡<°
Ó#;¸BÑ#?�˜Ò Ø×"Ñ" 9Ô-Ø#)¬#¨i«.Ð*:Ð#;�˜Ò à#)�˜Ñ ä0Ø"ØÜœŸ™›Ó&ô
ð 	
ùò# cs   ÂEÚprevious_messagesc                 ód   — |�t        |«      dk(  ryd|d   v r|d   d   j                  d«      ryy)Nr   TrÉ   r  ÚdeltaF)r\   rZ   )rh   ri  s     rM   Ú_is_new_content_deltaz*GeminiRealtimeConfig._is_new_content_delta…  sG   € ð Ð$¬Ð,=Ó(>À!Ò(CØØÐ& rÑ*Ñ*Ð/@ÀÑ/DÀVÑ/L×/UÑ/UÐV]Ô/^ØØrO   Úresponse_idÚoutput_item_idÚconversation_idc                 ó’  — i }|�&	 t        j                  |«      j                  di «      }|j                  di «      }|j                  ddg«      }t	        t
        t           |«      D �	cg c]  }	|	j                  «       ‘Œ }
}	|j                  d«      }|j                  d«      }g }t        ddt        j                  «       › �d	|d
d g ||
||dœ	¬«      }|j                  |«       t        ddt        j                  «       › �|d|ddd
dg dœ¬«      }|j                  |«       |j                  t	        t        ddt        j                  «       › �d |ddd
dg dœdœ«      «       t        ddddt        j                  «       › �||dk(  rdddœndddœ|¬«      }|j                  |«       |S # t         j                  $ r i }Y �Œ•w xY wc c}	w )Nrl   râ   rè   r  r×   rç   úresponse.createdÚevent_úrealtime.responseÚin_progress©	rV  r8  ÚstatusÚstatus_detailsrÿ   ro  rÙ   r×   Úmax_output_tokens©rÉ   r`  r7  úresponse.output_item.addedr   úrealtime.itemrM  Ú	assistant©r8  rV  rÉ   rv  rå   rB  ©rÉ   r`  rm  Úoutput_indexr-  úconversation.item.added©rÉ   r`  Úprevious_item_idr-  zresponse.content_part.addedr¡   r5  ©rÉ   r¡   r©   ©rÉ   Ú
transcript)rÉ   Úcontent_indexr  r`  Úitem_idr¥   rm  )rº   r»   r’   r¼   r   rë   rI   rJ   r!   r
   rb  rW  r#   r   r   )rh   rm  rn  ro  r§   rµ   rc  r#  re  rð   rf  Ú_temperatureÚ_max_output_tokensÚresponse_itemsÚresponse_createdÚresponse_output_item_addedÚresponse_content_part_addeds                    rM   Úreturn_new_content_delta_eventsz4GeminiRealtimeConfig.return_new_content_delta_events�  s*  € ð HJÐ*Ø(Ð4ð8Ü59·Z±ZÐ@]Ó5^×5bÑ5bÐcjÐlnÓ5oÐ2ð $F×#IÑ#IÐJ\Ð^`Ó#aÐØ#4×#8Ñ#8Ð9MÐPWÈyÓ#YÐÜ?CÄDÌÁIÐO`Ó?aÖb°8˜hŸn™nÕ.ÐbˆÐbà/×3Ñ3°MÓBˆØ$5×$9Ñ$9Ð:KÓ$LÐà<>ˆÜ"HØ#ØœdŸj™j›l˜^Ð,à-Ø!Ø'Ø"&ØØ#2Ø)Ø+Ø%7ñ
ô#
Ðð 	×ÑÐ.Ô/ô -XØ-ØœdŸj™j›l˜^Ð,Ø#Øà$Ø)Ø!Ø'Ø#Øñô-
Ð"ð 	×ÑÐ8Ô9ð
 	×ÑÜÜ$à5Ø"(¬¯©«¨Ð 7Ø(,à,Ø"1Ø )Ø"/Ø +Ø#%ññ	óô	
ô& .TØ.ØØØœdŸj™j›l˜^Ð,Ø"ð  Ò'ð #Øòð $Ø"$ñð
 $ô#.
Ð#ð& 	×ÑÐ9Ô:ØÐøôm ×'Ñ'ò 8Ø57Ó2ð8üò cs   †%F( Á)GÆ(GÇ Gc           	      ó,  — d}	 d|v r>d|d   v r7|d   d   D ],  }d|v r	||d   z  }Œd|v sŒ||d   j                  dd«      z  }Œ. t        |dk(  rd	nd
ddt	        j
                  «       › �|d||¬«      S # t        $ r}t        d|› d|› �«      ‚d }~ww xY w)Nr5  Ú	modelTurnr    r¡   r¢   rU   z)Error transforming content delta events: z, got message: úresponse.output_text.deltazresponse.output_audio.deltar   rr  )rÉ   r†  r`  r‡  r  rm  rk  )r’   Ú	Exceptionr›   r   r
   rb  )rh   rM  rn  rm  r§   rk  r¥   Úes           rM   Útransform_content_delta_eventsz3GeminiRealtimeConfig.transform_content_delta_eventsó  sâ   € ð ˆð	fØ˜gÑ%¨'°W¸[Ñ5IÑ*IØ# KÑ0°Ñ9ò D�DØ ‘~Ø  f¡Ñ-™Ø%¨Ò-Ø  lÑ!3×!7Ñ!7¸ÀÓ!CÑC™ð	Dô +Ø2<ÀÒ2FÑ.ÐLiØØœdŸj™j›l˜^Ð,Ø"ØØ#Øô
ð 	
øô ò 	fÜÐHÈÈÈ?Ð[bÐZcÐdÓeÐeûð	fús   „'A4 ¬A4 Á4	BÁ=BÂBÚdelta_chunksÚcurrent_output_item_idÚcurrent_response_idc           	      ón  — |r#dj                  |D �cg c]  }|d   ‘Œ	 c}«      }nd}|€dt        j                  «       › �}|€dt        j                  «       › �}|dk(  r't        dddt        j                  «       › �|d||¬	«      S |d
k(  r&t	        dddt        j                  «       › �|d|¬«      S y c c}w )Nr5  rk  Úitem_Úresp_r¡   zresponse.output_text.doner   rr  )rÉ   r†  r`  r‡  r  rm  r¡   r©   zresponse.output_audio.done)rÉ   r†  r`  r‡  r  rm  )rG  r
   rb  r    r   )rh   r•  r–  r—  r§   Údelta_chunkrk  s          rM   Útransform_content_done_eventz1GeminiRealtimeConfig.transform_content_done_event  sÔ   € ñ Ø—G‘GÀ\ÖR°k˜[¨Ó1ÒRÓS‰EàˆEØ!Ð)Ø',¬T¯Z©Z«\¨NÐ%;Ð"ØÐ&Ø$)¬$¯*©*«,¨Ð"8ÐØ˜ÒÜ1Ø0ØØ!¤$§*¡*£, Ð0Ø.ØØ/Øôð ð ˜7Ò"Ü2Ø1ØØ!¤$§*¡*£, Ð0Ø.ØØ/ôð ð #ùò# Ss   ’B2Údelta_done_eventc                 óÚ  — |€dt        j                  «       › �}|€dt        j                  «       › �}g }t        t        dz  |j	                  d«      «      }t        dddt        j                  «       › �|d|r
|dk(  rd|dœnd	d
dœ|¬«      }|j                  |«       t        ddt        j                  «       › �d||dddd|r
|dk(  rd|dœnd	d
dœgdœ¬«      }|j                  |«       |S )z`
        - return response.content_part.done
        - return response.output_item.done
        Nr™  rš  r¡   zresponse.content_part.doner   rr  rƒ  r©   r5  r„  )rÉ   r†  r`  r‡  r  r¥   rm  úresponse.output_item.doner{  rM  Ú	completedr|  r}  )rÉ   r`  r  rm  r-  )r
   rb  r   rI   r’   r   rW  r   )	rh   r–  r—  r�  r§   Úreturned_itemsÚdelta_done_event_textÚresponse_content_part_doneÚresponse_output_item_dones	            rM   Ú%return_additional_content_done_eventsz:GeminiRealtimeConfig.return_additional_content_done_events2  s1  € ð "Ð)Ø',¬T¯Z©Z«\¨NÐ%;Ð"ØÐ&Ø$)¬$¯*©*«,¨Ð"8ÐØ<>ˆä'+¬C°$©JÐ8H×8LÑ8LÈVÓ8TÓ'UÐä,IØ-ØØœdŸj™j›l˜^Ð,Ø*Øñ )¨Z¸6Ò-Að  Ð)>Ò?ð $Ø"$ñð
 ,ô-
Ð"ð  	×ÑÐ8Ô9ä+GØ,ØœdŸj™j›l˜^Ð,ØØ+à,Ø)Ø!Ø%Ø#ñ 1°ZÀ6Ò5Ið "(Ð1FÒGð %,Ø*,ñð		ñô,
Ð!ð. 	×ÑÐ7Ô8ØÐrO   Úframec                 ó¦   — t        |t        «      r|j                  dd«      nd}t        |t        «      r	d| _        |S | j                  }d| _        |S )zäPop usageMetadata from the frame (authoritative) or drain the pending buffer.

        Uses pop so a frame with both ``toolCall`` and ``turnComplete`` can't
        attribute the same counts to two response.done events.
        ÚusageMetadataN)rH   r‚   rï   rf   )rh   r¦  Úin_frameÚbuffereds       rM   Ú)_consume_usage_metadata_for_response_donez>GeminiRealtimeConfig._consume_usage_metadata_for_response_doneq  sQ   € ô ?IÈÔPTÔ>U˜%Ÿ)™) O°TÔ:Ð[_ˆÜ�h¤Ô%Ø+/ˆDÔ(ØˆOØ×6Ñ6ˆØ'+ˆÔ$ØˆrO   Útool_call_messagec                 ór  — |j                  dg «      }|xs dt        j                  «       › �}|xs dt        j                  «       › �}t        j                  dt        |«      «       g }t        |«      D �]>  \  }}	|	j                  dd«      xs$ dt        j                  «       j                  d d › �}
|	j                  d	d«      }|
r�|r‹|| j                  |
<   | j                  j                  |
«       t        | j                  «      | j                  kD  r?| j                  j                  d
¬«       t        | j                  «      | j                  kD  rŒ?|j                  t        ddt        j                  «       › �||› d|› �||
|t        j                  |	j                  di «      «      ¬«      «       �ŒA |S )NÚfunctionCallsrš  r™  z>Gemini Realtime: Transforming %s tool call(s) to OpenAI formatr8  r5  Úcall_é   r9  F)Úlastz%response.function_call_arguments.donerr  Ú_tool_Úargs)rÉ   r`  rm  r‡  r  r4  r9  Ú	arguments)r’   r
   rb  r	   rÄ   r\   Ú	enumerateÚhexre   r;  Ú_TOOL_CALL_ID_TO_NAME_MAXÚpopitemrW  r   rº   rÅ   )rh   r¬  rm  rn  Úfunction_callsÚresolved_response_idÚresolved_output_item_idÚeventsÚidxÚfcr4  r9  s               rM   Útransform_tool_call_eventsz/GeminiRealtimeConfig.transform_tool_call_events  s‘  € ð !2× 5Ñ 5°oÀrÓ JˆØ&1Ò&K°u¼T¿Z¹Z»\¸NÐ5KÐØ)7Ò)Q¸UÄ4Ç:Á:Ã<À.Ð;QÐä×ÑÐ]Ô_bÐcqÓ_rÔsàGIˆÜ  Ó0ó 	‰GˆC�Ø—f‘f˜T 2Ó&ÒI¨E´$·*±*³,×2BÑ2BÀ3ÀBÐ2GÐ1HÐ*IˆGØ—6‘6˜& "Ó%ˆDá™4Ø6:�×*Ñ*¨7Ñ3Ø×*Ñ*×6Ñ6°wÔ?Ü˜$×4Ñ4Ó5¸×8VÑ8VÒVØ×.Ñ.×6Ñ6¸EÐ6ÔBô ˜$×4Ñ4Ó5¸×8VÑ8VÓVð �M‰MÜ7Ø@Ø%¤d§j¡j£l ^Ð4Ø 4Ø6Ð7°v¸c¸UÐCØ!$Ø#ØÜ"Ÿj™j¨¯©°¸Ó);Ó<ô	öð	ð. ˆrO   ÚobjÚpathc                 óp   — |j                  d«      }| }|D ]  }t        |t        «      r
||v r||   }Œ y  |S )Nr7   )r	  rH   r‚   )rÀ  rÁ  ÚkeysÚcurrentr„   s        rM   Úget_nested_valuez%GeminiRealtimeConfig.get_nested_value¥  sF   € à—j‘j “oˆØˆØò 	ˆCÜ˜'¤4Ô(¨S°G©^Ø! #™,‘áð		ð
 ˆrO   Útransformed_messageÚcurrent_delta_chunksc                 ó@  — 	 t        |t        «      r;g }d}|D ],  }|d   dk(  sŒ|j                  t        t        |«      «       d}Œ. |sd }|S |d   dk(  r%|€g }|j                  t        t        |«      «       |S d }|S # t
        $ r}t        d|› d|› �«      ‚d }~ww xY w)NFrÉ   r‘  Tz%Error updating current delta chunks: ú, got transformed_message: )rH   rë   rW  r   r   r’  r›   )rh   rÆ  rÇ  Úany_delta_chunkÚeventr“  s         rM   Úupdate_current_delta_chunksz0GeminiRealtimeConfig.update_current_delta_chunks°  sá   € ð
	ÜÐ-¬tÔ4Ø')Ð$Ø"'�Ø0ò /�EØ˜V‘}Ð(DÓDØ,×3Ñ3´DÔ9TÐV[Ó4\Ô]Ø*.™ð/ñ 'Ø+/Ð(ð (Ð'ð (¨Ñ/Ð3OÒOà+Ð3Ø/1Ð,Ø(×/Ñ/´Ô5PÐReÓ0fÔgð (Ð'ð ,0Ð(Ø'Ð'øÜò 	ÜØ7¸°sÐ:UÐViÐUjÐkóð ûð	úó(   ‚!A> ¤(A> Á,A> Á:A> Á>	BÂBÂBÚcurrent_item_chunksc                 ó@  — 	 t        |t        «      r;g }d}|D ],  }|d   dk(  sŒ|j                  t        t        |«      «       d}Œ. |sd }|S |d   dk(  r%|€g }|j                  t        t        |«      «       |S d }|S # t
        $ r}t        d|› d|› �«      ‚d }~ww xY w)NFrÉ   rŸ  Tz$Error updating current item chunks: rÉ  )rH   rë   rW  r   r   r’  r›   )rh   rÆ  rÎ  Úany_item_chunkrË  r“  s         rM   Úupdate_current_item_chunksz/GeminiRealtimeConfig.update_current_item_chunksÎ  sà   € ð
	yÜÐ-¬tÔ4Ø&(Ð#Ø!&�Ø0ò .�EØ˜V‘}Ð(CÓCØ+×2Ñ2´4Ô8TÐV[Ó3\Ô]Ø)-™ð.ñ &Ø*.Ð'ð 'Ð&ð ' vÑ.Ð2MÒMØ*Ð2Ø.0Ð+Ø'×.Ñ.¬tÔ4PÐReÓ/fÔgð 'Ð&ð +/Ð'Ø&Ð&øÜò 	yÜÐCÀAÀ3ÐFaÐbuÐavÐwÓxÐxûð	yúrÍ  Úcurrent_conversation_idÚoutput_itemsc                 óÎ  — |€dt        j                  «       › �}|€dt        j                  «       › �}|r&t        j                  |«      j	                  di «      }ni }|j	                  di «      }|j	                  d«      }|j	                  d«      }	|j	                  ddg«      }
t        t        t           |
«      D �cg c]  }|j                  «       ‘Œ }}| j                  t        t        |«      «      }|�9t        j                  t        t        i t        t        |«      ¥d	|i¥«      ¬
«      }n
t        «       }t        j                   |«      }|j#                  «       }| j%                  |«       t'        ddt        j                  «       › �t)        d|dd |r|D �cg c]  }|d   ‘Œ	 c}ng |||¬«      ¬«      }|�||d   d<   |	�t        t*        |	«      |d   d<   |S c c}w c c}w )NÚconv_rš  rl   râ   r×   rç   rè   r  r¨  ©Úcompletion_responseúresponse.donerr  rs  r   r-  )rV  r8  rv  rw  rÿ   ro  rÙ   Úusagery  r7  rx  )r
   rb  rº   r»   r’   r   rë   rI   rJ   r«  r‚   r   Ú_calculate_usager   r0   r   Ú3_transform_chat_completion_usage_to_responses_usageÚ
model_dumpr“   r   r   rÒ   )rh   rM  r—  rÒ  rÓ  rµ   rc  r#  r×   rx  re  rð   rf  Úresolved_usage_metadataÚ_chat_completion_usageÚresponses_api_usageÚ_usage_dictÚoutput_itemÚresponse_done_events                      rM   Útransform_response_done_eventz2GeminiRealtimeConfig.transform_response_done_eventè  s  € ð #Ð*Ø(-¬d¯j©j«l¨^Ð&<Ð#ØÐ&Ø$)¬$¯*©*«,¨Ð"8Ðá(ÜKOÏ:É:Ø-óLç‰c�'˜2Óñ /ð 24Ð.à#E×#IÑ#IÐJ\Ð^`Ó#aÐØ.×2Ñ2°=ÓAˆØ#4×#8Ñ#8Ð9JÓ#KÐØ#4×#8Ñ#8Ð9MÐPWÈyÓ#YÐÜ?CÄDÌÁIÐO`Ó?aÖb°8˜hŸn™nÕ.ÐbˆÐbØ)-×)WÑ)WÔX\Ô]aÐcjÓXkÓ)lÐØ"Ð.Ü%7×%HÑ%HÜ$(Ü4ØU”tœD 'Ó*ÐU¨OÐ=TÑUó%ô&Ñ"ô &5Ó%6Ð"ä>×rÑrØ"ó
Ðð 1×;Ñ;Ó=ˆØ×.Ñ.¨{Ô;Ü%<Ø ØœdŸj™j›l˜^Ð,Ü5Ø*Ø&Ø"Ø#ÙQ]ÀÖM°˜ VÓ,ÓMÐceØ 7Ø&Ø!ô	ô&
Ðð Ð"Ø=HÐ 
Ñ+¨MÑ:ØÐ(ÜCGÌÐM^ÓC_Ð 
Ñ+Ð,?Ñ@à"Ð"ùòI cùò2 Ns   Â=GÆG"Úopenai_eventÚ!realtime_response_transform_inputc                 óâ  — |d   }|d   }|d   }|d   }|d   }	g }
|t         j                  k(  s|t         j                  k(  r˜|xs dt        j                  «       › �}|sHdt        j                  «       › �}|xs dt        j                  «       › �}| j                  |	||||¬	«      }
| j                  t        di |d
   ¤Ž|||¬«      }|
j                  |«       nŽ|t         j                  k(  s|t         j                  k(  rh| j                  ||||¬«      }|g}
|j                  d«      xs |}|j                  d«      xs |}| j                  ||||¬«      }|
j                  |«       |
|||||dœS )Nr–  r—  rÒ  rÇ  rµ   rš  r™  rÕ  ©rµ   rm  rn  ro  r§   ÚserverContent©r§   )r–  r—  r•  r§   r‡  rm  )r–  r—  r�  r§   )Úreturned_messager–  r—  rÒ  rÇ  Úcurrent_delta_typerm   )r   r£   r¤   r
   rb  rŽ  r”  r   rW  rª   r«   rœ  r’   r¥  Úextend)rh   rä  r%  rå  r§   r–  r—  rÒ  rÇ  rµ   rê  rÆ  Útransformed_content_done_eventÚresolved_item_idrº  Úadditional_itemss                   rM   Úhandle_openai_modality_eventz1GeminiRealtimeConfig.handle_openai_modality_event&  sã  € ð "CÐC[Ñ!\ÐØ?Ð@UÑVÐØ"CÐD]Ñ"^ÐØ&GÐH^Ñ&_ÐØ/PÐQpÑ/qÐ%à79ÐàÔ4×HÑHÒHØÔ7×LÑLÒLà"5Ò"O¸5ÄÇÁÃÀÐ9OÐÙ)à+0´·±³°Ð)?Ð&Ø*AÒ*[ÀuÌTÏZÉZË\ÈNÐE[Ð'Ø#'×#GÑ#GØ2OØ 3Ø#9Ø$;Ø)ð $Hó $Ð ð *.×)LÑ)LÜ0ÑQ°<ÀÑ3PÑQØ&Ø#Ø%ð	 *Mó *Ðð ×#Ñ#Ð$7Õ8àÔ4×GÑGÒGØÔ7×KÑKÒKà48×4UÑ4UØ'=Ø$7Ø1Ø%ð	 5Vó 5Ð*ð !?Ð?Ðð 'E×&HÑ&HÈÓ&SÒ&mÐWmÐØ*H×*LÑ*LÈ]Ó*[Ò*rÐ_rÐ à&*×&PÑ&PØ'7Ø$8Ø!?Ø%ð	 'Qó 'Ðð ×#Ñ#Ð$4Ô5ð !1Ø&<Ø#6Ø'>Ø$8Ø",ñ
ð 	
rO   r„   rë  c                 óÐ  — t        |t        «      r#|j                  d«      }|j                  d«      }nd }d }d }|r| j                  |«      }n…|r| j	                  |¬«      }npt
        j                  «       D ]Y  \  }}||k(  r|} nMd|v sŒ|j                  d«      \  }	}
}|	|k(  sŒ/t        |t        «      sŒ@t        j                  ||«      €ŒW|} n |€t        d|› d|› �«      ‚|S )Nr�  ÚgenerationCompleteré  r7   úUnknown openai event: z	, value: )rH   r‚   r’   r¦   r¬   r6   rƒ   Ú	partitionr`   rÅ  r›   )rh   r„   r…   rë  Úmodel_turn_eventÚgeneration_complete_eventrä  Úmap_keyÚcandidate_eventÚprefixÚ_Únested_paths               rM   Úmap_openai_eventz%GeminiRealtimeConfig.map_openai_evento  s	  € ô �eœTÔ"Ø$Ÿy™y¨Ó5ÐØ(-¯	©	Ð2FÓ(GÑ%à#ÐØ(,Ð%ØSWˆÙØ×4Ñ4Ð5EÓF‰LÙ&Ø×=Ñ=ÐI[Ð=Ó\‰Lô -M×,RÑ,RÓ,Tò Ñ(�˜Ø˜c’>Ø#2�LÙØ˜'’>Ø-4×->Ñ->¸sÓ-CÑ*�F˜A˜{à #›Ü& u¬dÕ3Ü0×AÑAÀ%ÈÓUÑaà'6˜Ùðð ÐÜÐ5°c°U¸)ÀEÀ7ÐKÓLÐLØÐrO   c                 óæ   — | j                   dk  s| j                  |«      sy| j                   t        z  }d| _         t        |t        z  «      }t        |t
        z  dz  «      }d||||z   d|dœdœ}|S )zjGemini Live sends no usageMetadata for transcribe sessions; estimate billing from streamed audio duration.r   Né<   Útokensr�   )rÉ   Úinput_tokensÚoutput_tokensÚtotal_tokensr‰   )rg   r  rT   ÚroundrQ   rS   )rh   r•   Úaudio_secondsr�   r  rÙ  s         rM   Ú+_consume_input_transcription_usage_estimatez@GeminiRealtimeConfig._consume_input_transcription_usage_estimate™  s‡   € à×+Ñ+¨qÒ0¸×8UÑ8UÐV[Ô8\ØØ#×?Ñ?ÔBdÑdˆØ+,ˆÔ(Ü# MÔ4bÑ$bÓcˆÜ$ ]Ô5iÑ%iÐlnÑ%nÓoˆàØ(Ø*Ø(¨=Ñ8Ø34ÀlÑ#Sñ>
ˆð ˆrO   c                 ó$   — | j                  |«      S rr   )r  rÝ   s     rM   Úunbilled_usage_on_session_closez4GeminiRealtimeConfig.unbilled_usage_on_session_closeª  s   € Ø×?Ñ?ÀÓFÐFrO   Úlogging_objc                 ó0  ‡3— 	 t        j                  |«      }t        j                  dt        |t        «      rt        |j                  «       «      nt        |«      j                  «       |j                  }|d   }|d   }	|d   }
|d	   }|d
   }|d   }|d   }g }|j!                  d«      Š3t        ‰3t        «      �r¶‰3j!                  d«      }t        |t        «      r||j!                  d«      rk| j#                  |«      }|j%                  t'        t(        ddt+        j,                  «       › �|d   dt+        j,                  «       › �ddœ|€i nd|i¥«      «       ‰3j!                  d«      }t        |t        «      rÆ|j!                  d«      rµ|	€dt+        j,                  «       › �}	|€Wdt+        j,                  «       › �}|
xs dt+        j,                  «       › �}
|j/                  | j1                  ||	||
d¬«      «       |j%                  t'        t(        ddt+        j,                  «       › �|d   |dd|	|d   dœ«      «       |€d‰3vr‰3j3                  dd«       h d £}t5        ˆ3fd!„|D «       «       }nd"}d"}t7        |j9                  «       «      D �]i  \  }}|t:        vrŒ|dk(  r|rŒ| j=                  |||¬#«      }|t>        j@                  k(  r(| jC                  |||d
   «      }|j%                  |«       Œg|tD        jF                  k(  �r¦|j!                  d$«      sd%}Œ�|
€dt+        j,                  «       › �}
i }|�&	 t        j                  |«      j!                  d&i «      }|j!                  d'i «      xs i }t'        t6        t           |j!                  d(d)g«      «      D �cg c]  }|jK                  «       ‘Œ }}|	€€dt+        j,                  «       › �}	dt+        j,                  «       › �}|j%                  d*dt+        j,                  «       › �d+|	d,dg |
||j!                  d-«      |j!                  d.«      d/œ	d0œ«       | jM                  ||	|¬1«      }tO        |«      D �]"  \  }} | d2   }!|!d3d4d5| d6   | d7   | d8   d9œ}"|j%                  tQ        d:dt+        j,                  «       › �|	|i |"¥d,d;d<œ¥¬=«      «       |j%                  t'        t(        d>dt+        j,                  «       › �di |"¥d,d;d<œ¥d?œ«      «       |j%                  t'        t(        d@dt+        j,                  «       › �|	|!|| d6   | d8   dAœ«      «       |j%                  | «       |j%                  tS        dBdt+        j,                  «       › �|	|i |"¥¬=«      «       �Œ% | jU                  |«      }#|#�+tW        jX                  t'        tZ        i |¥dC|#i¥«      ¬D«      }$n
t]        «       }$t_        j`                  |$«      }%|%jc                  «       }&| je                  |&«       tg        dEdt+        j,                  «       › �ti        |	d+d5d|D �'cg c]  }'|'d2   d3d4d5|'d6   |'d7   |'d8   d9œ‘Œ c}'|
||&¬F«      ¬0«      }(|j!                  d-«      })|)�|)|(dG   d-<   |j!                  d.«      }*|*�t'        tj        |*«      |(dG   dH<   |j%                  |(«       d}d}	�Œ!|t>        jl                  k(  r||xr t5        dI„ |D «       «      }+|	€.|+r,|j!                  dC«      },t        |,t        «      r|,| _7        d%}�Œz| jq                  t[        dWi |¤Ž|	|
|d¬J«      }-|j%                  |-«       d}d}	�Œ°|t>        jr                  k(  s9|t>        jt                  k(  s&|t>        jv                  k(  s|t>        jx                  k(  rbi |¥||	|
||||dKœ¥}.| j{                  |||.d|j|                  v rdnd¬L«      }/|j/                  |/dM   «       |/d   }|/d   }	|/d   }
|/d	   }|/d   }�Œ^t        dN|› �«      ‚ t        |«      dk(  r—|D �cg c]  }|t:        v r|dk(  r|s	|dOk(  r|s|‘Œ }0}|j!                  dC«      },t        |,t        «      r|,| _7        |0s|||	||
|||dPœS t        |t        «      r|j                  dd¬«      }nt        |«      }t        dQ|› �«      ‚| j�                  ||¬R«      }| jƒ                  ||¬S«      }|D ];  }1t        |1t        «      r|1j!                  dT«      ndU}2t        j                  dV|2«       Œ= |||	||
|||dPœS # t         j                  $ r> t        |t        «      r|j                  dd¬«      }nt        |«      }t        d|› �«      ‚w xY w# t         j                  tH        f$ r i }Y �Œ#w xY wc c}w c c}'w c c}w )Xz½
        Keep this state less - leave the state management (e.g. tracking current_output_item_id, current_response_id, current_conversation_id, current_delta_chunks) to the caller.
        rO  rœ   rP  rR  z1Realtime Response Transform: Gemini frame keys=%sr–  r—  rÒ  rÇ  rµ   rÎ  rë  rè  ÚinputTranscriptionr¡   z5conversation.item.input_audio_transcription.completedrr  r™  r   )rÉ   r`  r…  r‡  r†  NrÙ  ÚoutputTranscriptionrš  rÕ  r©   rç  z&response.output_audio_transcript.delta)rÉ   r`  r…  r‡  r†  r  rm  rk  r�  rò  >   r�  ÚinterruptedrF  rò  c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrr   rm   )rs   rt   Úserver_contents     €rM   ru   zCGeminiRealtimeConfig.transform_realtime_response.<locals>.<genexpr>  s   øè ø€ Ò,^ÀQ¨Q°.Ô-@Ñ,^ùrv   F)r„   r…   rë  r®  Trl   râ   rè   r  rq  rs  rt  r×   rç   ru  ry  )rm  rn  r‡  r{  Úfunction_callr   r4  r9  r´  )r8  rV  rÉ   rv  r4  r9  r´  rz  r5  )rv  r´  r~  r€  r�  z&response.function_call_arguments.delta)rÉ   r`  rm  r‡  r  r4  rk  rŸ  r¨  rÖ  rØ  )r8  rV  rv  rw  rÿ   ro  rÙ   rÙ  r7  rx  c              3   ód   K  — | ](  }|j                  d i «      j                  d«      dk(  –— Œ* y­w)r-  rÉ   r  Nr²   )rs   Úchunks     rM   ru   zCGeminiRealtimeConfig.transform_realtime_response.<locals>.<genexpr>ß  s2   è ø€ ò IØMR�E—I‘I˜f bÓ)×-Ñ-¨fÓ5¸ÕHñIùs   ‚.0)rM  r—  rÒ  rµ   rÓ  )r–  r—  rÒ  rÇ  rÎ  rë  rµ   ré  rê  ró  r5   )r7  r–  r—  rÇ  rÒ  rÎ  rë  rµ   zUnknown message type: )rÆ  rÇ  )rÆ  rÎ  rÉ   Úunknownz,Realtime Response Transform: OpenAI event=%srm   )Brº   r»   r¼   rH   rT  rU  rI   r›   r	   rÄ   r‚   ÚsortedrÃ  rÉ   Ú__name__Úlitellm_trace_idr’   r  rW  r   r   r
   rb  rì  rŽ  rï   rz   rë   rƒ   r9   rü  r   ÚSESSION_CREATEDrh  r'   ÚFUNCTION_CALL_ARGUMENTS_DONEr½   rJ   r¿  rµ  r#   r   r«  r   rÚ  r   r0   r   rÛ  rÜ  r“   r   r   rÒ   ÚRESPONSE_DONErf   rã  r£   rª   r¤   r«   rð  r…   r\   rÌ  rÑ  )4rh   rM  r•   r  rå  r%  rX  r^  r–  r—  rÒ  rÇ  rµ   rÎ  rë  rê  Úinput_txÚtranscription_usageÚ	output_txÚ_model_content_keysÚserver_content_handledÚtool_call_handledr„   r…   rä  rÆ  Úsession_setupÚtool_call_generation_configrð   Útool_call_modalitiesÚtool_call_eventsr½  Ú	tool_callr‡  Úfunction_call_itemÚ!resolved_tool_call_usage_metadataÚ _tool_call_chat_completion_usageÚtool_call_responses_api_usageÚ_tool_usage_dictÚteÚtool_call_done_eventÚtool_call_temperatureÚtool_call_max_output_tokensÚ_has_pending_function_callÚstandalone_usage_metadataÚtransformed_response_done_eventÚ_modality_inputÚ_returned_messageÚunhandled_known_keysÚmsgÚ
event_typer  s4                                                      @rM   Útransform_realtime_responsez0GeminiRealtimeConfig.transform_realtime_response­  s„  ø€ ð	EÜ"&§*¡*¨WÓ"5ˆLô 	×ÑØ?Ü,6°|ÄTÔ,JŒV�L×%Ñ%Ó'Ô(ÔPTÐUaÓPb×PkÑPkô	
ð
 %0×$@Ñ$@Ðà!BÐC[Ñ!\ÐØ?Ð@UÑVÐØ"CÐD]Ñ"^ÐØ@ÐAWÑXÐØ/PÐQpÑ/qÐ%Ø?Ð@UÑVÐØ5VÐWkÑ5lÐØ>@Ðà ,× 0Ñ 0°Ó AˆÜ�n¤dÕ+Ø,×0Ñ0Ð1EÓFˆHÜ˜(¤DÔ)¨h¯l©l¸6Ô.BØ-1×-]Ñ-]Ð^cÓ-dÐ#Ø ×'Ñ'ÜÜ,à$[Ø*0´·±³°Ð(?Ø*2°6Ñ*:Ø).¬t¯z©z«|¨nÐ'=Ø-.ñð &9Ð%@™rÀwÐPcÐFdðó
ôð  .×1Ñ1Ð2GÓHˆIÜ˜)¤TÔ*¨y¯}©}¸VÔ/DØ&Ð.Ø,1´$·*±*³,°Ð*@Ð'Ø)Ð1Ø/4´T·Z±Z³\°NÐ-CÐ*Ø.EÒ._È5ÔQU×Q[ÑQ[ÓQ]ÐP^ÐI_Ð+Ø$×+Ñ+Ø×<Ñ<Ø:WØ(;Ø+AØ,CØ'.ð =ó ôð !×'Ñ'ÜÜ,à$LØ*0´·±³°Ð(?Ø*3°FÑ*;Ø'=Ø-.Ø,-Ø+>Ø%.¨vÑ%6ñ	óôð& "Ð)¨kÀÑ.OØ×"Ñ"Ð#7¸Ô>ò*Ðô *-Ó,^ÐJ]Ô,^Ó)^Ð%^Ñ"à%*Ð"à!ÐÜ˜|×1Ñ1Ó3Ó4ó ~	J‰JˆC�ð
 Ô6Ñ6Øð �oÒ%Ñ*@Øà×0Ñ0ØØØ#5ð 1ó ˆLð Ô7×GÑGÒGØ&*×&JÑ&JØØ&Ø5Ð6UÑVó'Ð#ð
 !×'Ñ'Ð(;Õ<ØÔ!9×!VÑ!VÓVØ—y‘y Ô1à(,Ð%Øà*Ð2Ø05´d·j±j³l°^Ð.DÐ+à:<�Ø0Ð<ð+Ü(,¯
©
Ð3PÓ(Q×(UÑ(UÐV]Ð_aÓ(b˜ð /<×.?Ñ.?Ð@RÐTVÓ.WÒ.]Ð[]Ð+ô %)ÜœS™	Ø3×7Ñ7Ð8LÈwÈiÓXó%ö(à ð —N‘NÕ$ð(Ð$ð (ð 'Ð.Ø,1´$·*±*³,°Ð*@Ð'Ø/4´T·Z±Z³\°NÐ-CÐ*Ø$×+Ñ+à$6Ø*0´·±³°Ð(?à*=Ø&9Ø*7Ø26Ø*,Ø3JØ.BØ/J×/NÑ/NÈ}Ó/]Ø5P×5TÑ5TÐUfÓ5gñ
)ñôð$ $(×#BÑ#BØØ 3Ø#9ð $Có $Ð ô
 '0Ð0@Ó&Aó D‘N�C˜Ø'¨	Ñ2�Gà%Ø"1Ø /Ø"-Ø#,¨YÑ#7Ø )¨&Ñ 1Ø%.¨{Ñ%;ñRÐ&ð %×+Ñ+ÜCØ!=Ø'-¬d¯j©j«l¨^Ð%<Ø(;Ø),ð"Ø"4ð"à*7Ø-/ò"ô
ôð  %×+Ñ+ÜÜ0à(AØ.4´T·Z±Z³\°NÐ,CØ48ð)"Ø&8ð)"à.;Ø13ò)"ñ		óôð" %×+Ñ+ÜÜ0à(PØ.4´T·Z±Z³\°NÐ,CØ/BØ+2Ø03Ø+4°YÑ+?Ø)2°;Ñ)?ñóôð %×+Ñ+¨IÔ6à$×+Ñ+Ü4Ø!<Ø'-¬d¯j©j«l¨^Ð%<Ø(;Ø),Ø!7Ð$6Ð!7ôöðyDðL 59×4bÑ4bÐcoÓ4pÐ1Ø4Ð@Ü7I×7ZÑ7ZÜ,0Ü<ðØ".ðà /Ð1Rñó-ô8Ñ4ô 8GÓ7HÐ4ä4×hÑhØ8óð .ð
 $A×#KÑ#KÓ#MÐ Ø×6Ñ6Ð7GÔHÜ'>Ø(Ø%¤d§j¡j£l ^Ð4Ü=Ø.Ø2Ø*Ø'+ð '7ö ð !#ð ')¨¡mØ*9Ø(7Ø*5Ø+-¨i©=Ø(*¨6©
Ø-/°©_óò ð )@Ø#7Ø.ô'ô(Ð$ð2 )D×(GÑ(GÈÓ(VÐ%Ø(Ð4ØF[Ð(¨Ñ4°]ÑCØ.I×.MÑ.MÐN_Ó.`Ð+Ø.Ð:ÜLPÔQTÐVqÓLrÐ(¨Ñ4Ð5HÑIØ ×'Ñ'Ð(<Ô=Ø)-Ð&Ø&*Ò#ØÔ!9×!GÑ!GÒGØ-@ò .ÄSñ IØViôIó FÐ*ð 'Ð.Ñ3Mð
 1=×0@Ñ0@ÀÓ0QÐ-Ü!Ð";¼TÔBØ7P˜Ô4Ø-1Ð*ÙØ26×2TÑ2TÜ<ÑL¸|ÑLØ(;Ø,CØ2OØ!%ð 3Uó 3Ð/ð !×'Ñ'Ð(GÔHØ)-Ð&Ø&*Ò#àÔ 8× LÑ LÒLØÔ#;×#NÑ#NÒNØÔ#;×#PÑ#PÒPØÔ#;×#OÑ#OÒOð	CØ7ð	Cà.DØ+>Ø/FØ,@Ø+>Ø*<Ø5Rò	C�ð %)×$EÑ$EØ Ø Ø#Ø)/°<×3EÑ3EÑ)E™vÈ7ð	 %Fó %Ð!ð !×'Ñ'Ð(9Ð:LÑ(MÔNØ):Ð;SÑ)TÐ&Ø&7Ð8MÑ&NÐ#Ø*;Ð<UÑ*VÐ'Ø'8Ð9OÑ'PÐ$Ø%6Ð7KÑ%LÒ"ä Ð#9¸,¸Ð!HÓIÐIð}~	Jô~ ÐÓ  AÒ%ð (ö+àØÔ6Ñ6Ø Ò/Ñ4JØ 
Ò*Ñ/@ò	 ð+Ð ð +ð )5×(8Ñ(8¸Ó(IÐ%ÜÐ3´TÔ:Ø/H�Ô,Ù'à 0Ø.DØ+>Ø,@Ø/FØ+>Ø*<Ø5Rñ	ð 	ô ˜'¤5Ô)Ø%Ÿn™n¨W¸Y˜nÓG‘ä! '›l�ÜÐ5°k°]ÐCÓDÐDà#×?Ñ?Ø 0Ø!5ð  @ó  
Ðð #×=Ñ=Ø 0Ø 3ð >ó 
Ðð
 $ò 	]ˆCÜ,6°s¼DÔ,A˜Ÿ™ œÀyˆJÜ× Ñ Ð!OÐQ[Õ\ð	]ð
 )Ø&<Ø#6Ø$8Ø'>Ø#6Ø"4Ø-Jñ	
ð 		
øôK ×#Ñ#ò 	EÜ˜'¤5Ô)Ø%Ÿn™n¨W¸Y˜nÓG‘ä! '›l�ÜÐ5°k°]ÐCÓDÐDð	EûôH !×0Ñ0´)Ð<ò +Ø(*›ð+üò(ùòH ùòd+s0   ƒd Ì=%e'Î"f	Ø)fàfäAe$å'fæfc                 ó$   — t         j                   S rr   )r  Úgemini_live_defer_setupr}   s    rM   Úrequires_session_configurationz3GeminiRealtimeConfig.requires_session_configurationI  s   € ä×2Ñ2Ð2Ð2rO   c                 ó„   — t         j                  |«      g}d}d|› �d|ii dœ}|ri |d<   t        j                  d|i«      S )ac  

        ```
        {
            "model": string,
            "generationConfig": {
                "candidateCount": integer,
                "maxOutputTokens": integer,
                "temperature": number,
                "topP": number,
                "topK": integer,
                "presencePenalty": number,
                "frequencyPenalty": number,
                "responseModalities": [string],
                "speechConfig": object,
                "mediaResolution": object
            },
            "systemInstruction": string,
            "tools": [object]
        }
        ```
        Fr'  rè   )r•   râ   ré   ÚoutputAudioTranscriptionrl   )r`   r  rº   rÅ   )rh   r•   Úresponse_modalitiesÚoutput_audio_transcriptionÚsetup_configs        rM   rµ   z2GeminiRealtimeConfig.session_configuration_requestM  sm   € ô2 !×;Ñ;¸EÓBðF
Ðð -2Ð"ð
 ˜u˜gÐ&Ø!5Ð7JÐ Kà')ñ	9
ˆñ &Ø79ˆLÐ3Ñ4Ü�z‰zà˜ðó
ð 	
rO   rr   )r¯   )NN)Ur  Ú
__module__Ú__qualname__r·  rd   r‚   rÑ   ro   r{   r~   Ústaticmethodr   rI   rÒ   r†   r“   r˜   r�   r*   r   r¦   r+   r¬   r´   rÀ   rë   rÇ   r&   r   rÔ   rÞ   rõ   rû   r  r  r  r  r(   r  r   r   r!  r$  r+  r2  r/  r0  r]  r%   rh  r   rl  rŽ  r   r   r”  r    r   rœ  r¥  r«  r   r¿  rÅ  rÌ  r   rÑ  r   r   rã  r.   r-   rð  r'   rü  r,   r  r  rT  ÚLiteLLMLoggingObjr/   r5  r8  rµ   Ú__classcell__)ri   s   @rM   r`   r`   o   sÄ  ø„ Ø #Ðô2ð"¨ð "°ó "ð]¨$ð ]°4ó ]ð¨tó ð ð
 Sð 
°D¸¸c¸±Nð 
ÀtÈCÐQTÈHÁ~ò 
ó ð
ð ð°d¸3À¸8±nð ÈÈcÐSVÈhÉò ó ðñ"¨Dð ¸ð ÀsÈTÁzð Ð]aó ñx¨¨t©ð x¸Cð xÈ#ÐPTÉ*ð xÐ`có xð&WÐ/?ð WÐD\ó Wð.E¸È$Ñ8Nð EÐSkó EñN°có NðÈCÐRVÉJð Ð[_ó ð
DÐVYÐ\`ÑV`ð 
DÐeiÐjmÑenó 
Dð*Ð2Mð *ÐRló *ð0

°ð 

¸¸c¹ó 

ð0°ð 0È4ð 0ÐTXó 0ðd ð¨ð °$¸±+ò ó ðð( ð"¸ð "Àò "ó ð"ðH ð ð ¨ò ó ðð ð]¨ð ]°ò ]ó ð]ð ðb¨ð b°ò bó ðbð ð[¨#ð [Ð2Jò [ó ð[ð ð
¨3ð 
¸HÀS¹Mð 
ÈeÐTWÐY\ÐT\Éoò 
ó ð
ð ð¨3ð °t¸CÀ¸H±~ð È$ÈsÐTWÈxÉ.ò ó ðð7àð7ð ð7ð (+¨T¡zð	7ð
 
ˆc‰ó7ðr4°dð 4¸tÀC¹yó 4ð 3°ð  3¸$¸s¹)ó  3ðD4¨dð 4°t¸C±yó 4ð* 59ñ	2àð2ð ð2ð (+¨T¡zð	2ð
 
ˆc‰ó2ðp 59ñ	%
àð%
ð  ð%
ð (+¨T¡zð	%
ð
 
+ó%
ðR @DñàÐ 4Ñ5¸Ñ<ðð 
óð  59ñbàðbð ðbð ð	bð
 $ðbð (+¨T¡zðbð 
Ð"Ñ	#óbðH
à1ð
ð ð
ð ð	
ð
 $ð
ð 
%ó
ð8!àÐ6Ñ7¸$Ñ>ð!ð !$ d¡
ð!ð ! 4™Zð	!ð
 $ð!ð 
(Ð*IÑ	Ió!ðF=à # d¡
ð=ð ! 4™Zð=ð 9Ð;ZÑZð	=ð
 $ð=ð 
Ð"Ñ	#ó=ð~¸tð ÈÈtÉó ð" #'Ø%)ñ	$àð$ð ˜4‘Zð$ð ˜d™
ð	$ð
 
Ð5Ñ	6ó$ðL ð˜dð ¨#ð °#ò ó ððà1°DÐ9MÑ4NÑNðð #Ð#>Ñ?À$ÑFðð 
Ð)Ñ	*¨TÑ	1ó	ð<yà1°DÐ9MÑ4NÑNðyð "Ð">Ñ?À$ÑFðyð 
Ð*Ñ	+¨dÑ	2ó	yð@ 59ñ<#à1ð<#ð ! 4™Zð<#ð "% t¡ð	<#ð
 Ð7Ñ8¸4Ñ?ð<#ð (+¨T¡zð<#ð 
!ó<#ð|G
à.ðG
ð ðG
ð ,Jð	G
ð
 $ðG
ð 
1óG
ðR(àð(ð ð(ð ,¨dÑ2ð	(ð
 
"Ð$<Ñ	<ó(ðTÀð ÐImÐptÑItó ð"G°Sð GÐ=aÐdhÑ=hó GðZ
à�u‘ðZ
ð ðZ
ð 'ð	Z
ð
 ,JðZ
ð 
#óZ
ðx3°ó 3ð+
°3ð +
¸3÷ +
rO   r`   )VÚ__doc__rº   Úcollectionsr   Úcollections.abcr   r   Útypingr   r   r   r  r	   Úlitellm._uuidr
   Ú*litellm.litellm_core_utils.litellm_loggingr   rA  Ú-litellm.llms.base_llm.realtime.transformationr   rí   r   ÚBlitellm.responses.litellm_completion_transformation.transformationr   Úlitellm.types.llms.geminir   r   r   r   r   r   Úlitellm.types.llms.openair   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Úlitellm.types.llms.vertex_air(   r)   r*   Úlitellm.types.realtimer+   r,   r-   r.   r/   Úlitellm.utilsr0   Úcommon_utilsr2   r3   r  rª   r  r  r6   r‚   rI   Ú__annotations__r	  r9   ÚsetÚ	frozensetrD   rV  rN   rQ   rS   rT   rÒ   r^   r`   )r÷  s   0rM   ú<module>rT     s‡  ðòó Ý #ß -ß #Ñ #ã Ý "Ý Ý SÝ Lõõ÷÷ ÷÷ ÷ ÷ ÷ ÷(ñ ÷
õ õ *ç Lð .×=Ñ=Ø(@×(SÑ(SØ":×"HÑ"HØ!9×!GÑ!GØ(×EÑEñkÐ   %¨¨SÐ2JÐMeÑ2eÐ-eÑ(fÑ"gó ð UuÖ+uÈ¨G¯M©M¸#¸qÓ,AÀ!Ó,DÒ+uÐ ˜e C™jÓ uñ 7@Ú]ó7Ð ˜e I¨c¡NÑ3ó ð
D fð D°¸¸f¸Ñ1EÈÑ1Ló Dð& 9;Ð .°Ó :Ø>AÐ 4°eÓ AØ,1Ð " EÓ 1ð0 Sð 0¨Só 0ô
I
Ð-õ I
ùòK ,vs   Ã4E)