Ë
    uPêjC(  ã                   óÄ  — U d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZmZmZmZmZ d dlmZmZ d dlm Z m!Z!m"Z"m#Z# dZ$ee%d<   dZ&ee%d<    G d„ de«      Z'i Z(ee   e%d<   dddddœiZ)ee   e%d<   de*dededefd„Z+de,defd „Z-d!e,d"e,defd#„Z.d$ee*e,f   defd%„Z/d&edee*e*e0z  f   dz  fd'„Z1d(e*dz  de0dz  fd)„Z2y)*é    N)ÚMappingÚSequence)ÚFinal)ÚHeadersÚResponse)ÚSUBTITLE_RESPONSE_FORMATS)Ú)normalize_transcription_language_to_bcp47Úprocess_audio_file)ÚAudioTranscriptionRequestDataÚBaseAudioTranscriptionConfig)ÚBaseLLMException)ÚGeminiErrorÚGeminiModelInfo)ÚGeminiTranscriptionAudioInputÚGeminiTranscriptionConfigÚ%GeminiTranscriptionInteractionRequestÚ&GeminiTranscriptionInteractionResponseÚ!GeminiTranscriptionWordAnnotation)ÚAllMessageValuesÚ&OpenAIAudioTranscriptionOptionalParams)Ú	FileTypesÚTranscriptionResponseÚ)TranscriptionUsageInputTokenDetailsObjectÚTranscriptionUsageTokensObjectz
2026-05-20ÚINTERACTIONS_API_REVISIONÚ	word_infoÚWORD_INFO_ANNOTATION_TYPEc                   óv  — e Zd ZdZdedee   fd„Zede	fd„«       Z
deeef   deeef   dede	def
d	„Zd
ededeez  defd„Z	 	 ddeeef   dedee   deeef   deeef   dedz  dedz  defd„Z	 ddedz  dedz  dedeeef   deeef   de	dz  defd„Zdededeeef   deeef   def
d„Zdedefd„Zy)ÚGeminiAudioTranscriptionConfigzÙ
    Maps OpenAI /v1/audio/transcriptions onto the Gemini Interactions API
    (POST /v1beta/interactions) for transcription models like
    gemini-3.5-transcribe. https://ai.google.dev/gemini-api/docs/transcribe
    ÚmodelÚreturnc                 ó
   — g d¢S )N)ÚlanguageÚresponse_formatÚtimestamp_granularities© )Úselfr    s     ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/gemini/audio_transcription/transformation.pyÚget_supported_openai_paramsz:GeminiAudioTranscriptionConfig.get_supported_openai_params/   s   € ò JÐIó    c                  ó   — y)NTr&   )r'   s    r(   Úsupports_subtitle_synthesisz:GeminiAudioTranscriptionConfig.supports_subtitle_synthesis4   s   € àr*   Únon_default_paramsÚoptional_paramsÚdrop_paramsc                 ó¸   ‡— t        | j                  |«      «      Št        ˆfd„|j                  «       D «       «      }t	        g |j                  «       ¢|¢­«      S )Nc              3   ó6   •K  — | ]  \  }}|‰v sŒ||f–— Œ y ­w©Nr&   )Ú.0ÚkÚvÚsupported_paramss      €r(   ú	<genexpr>zCGeminiAudioTranscriptionConfig.map_openai_params.<locals>.<genexpr>@   s"   øè ø€ Òg©4¨1¨aÐQRÐVfÒQf  A¤Ñgùs   ƒ�	)Ú	frozensetr)   ÚtupleÚitemsÚdict)r'   r-   r.   r    r/   Úacceptedr6   s         @r(   Úmap_openai_paramsz0GeminiAudioTranscriptionConfig.map_openai_params8   sT   ø€ ô #,¨D×,LÑ,LÈUÓ,SÓ"TÐÜÓgÐ3E×3KÑ3KÓ3MÔgÓgˆÜÐ9�o×+Ñ+Ó-Ð9°Ñ9Ó:Ð:r*   Úerror_messageÚstatus_codeÚheadersc                 ó   — t        |||¬«      S )N)r?   Úmessager@   )r   )r'   r>   r?   r@   s       r(   Úget_error_classz.GeminiAudioTranscriptionConfig.get_error_classC   s   € ô  {¸MÐSZÔ[Ð[r*   NÚmessagesÚlitellm_paramsÚapi_keyÚapi_basec                 óf   — t        j                  |«      }|st        dd¬«      ‚i |¥d|t        dœ¥S )Ni‘  zVGoogle API key is required. Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable.©r?   rB   zapplication/json)zContent-Typezx-goog-api-keyzApi-Revision)r   Úget_api_keyr   r   )	r'   r@   r    rD   r.   rE   rF   rG   Úresolved_api_keys	            r(   Úvalidate_environmentz3GeminiAudioTranscriptionConfig.validate_environmentK   sK   € ô #2×"=Ñ"=¸gÓ"FÐÙÜØØpôð ð
Øð
à.Ø.Ü5ò	
ð 	
r*   Ústreamc                 ó6   — t        j                  |«      }|› d�S )Nz/v1beta/interactions)r   Úget_api_base)r'   rG   rF   r    r.   rE   rM   Úresolved_api_bases           r(   Úget_complete_urlz/GeminiAudioTranscriptionConfig.get_complete_urlb   s$   € ô $3×#?Ñ#?ÀÓ#IÐØ#Ð$Ð$8Ð9Ð9r*   Ú
audio_filec                 óø   — t        |«      }t        dt        j                  |j                  «      j                  d«      |j                  ¬«      }t        ||t        |«      ¬«      }t        t        |«      ¬«      S )NÚaudiozutf-8)ÚtypeÚdataÚ	mime_type)r    Úaudio_inputÚtranscription_config)rV   )r
   r   Úbase64Ú	b64encodeÚfile_contentÚdecodeÚcontent_typeÚ_build_interaction_requestÚ_build_transcription_configr   r;   )r'   r    rR   r.   rE   Úprocessed_audiorX   Úrequests           r(   Ú%transform_audio_transcription_requestzDGeminiAudioTranscriptionConfig.transform_audio_transcription_requestn   sn   € ô "4°JÓ!?ˆÜ:ØÜ×!Ñ! /×">Ñ">Ó?×FÑFÀwÓOØ%×2Ñ2ô
ˆô
 4ØØ#Ü!<¸_Ó!Mô
ˆô
 -´$°w³-Ô@Ð@r*   Úraw_responsec                 ó„  ‡	— 	 |j                  «       }t        j                  |«      }|j                  dk7  r1t        |j                  d|j                  › d|j                  › �¬«      ‚t        d„ |j                  D «       «      }t        dj                  d„ |D «       «      ¬	«      }d
|d<   t        ˆ	fd„|D «       «      }|r)t        |«      |d<   |d   j                  d«      }|�||d<   |j                  �™t        d„ |j                  j                   D «       «      }t#        d|j                  j$                  |j                  j&                  |j                  j(                  t+        ||j                  j$                  |z
  ¬«      ¬«      |_        |S # t        $ r% t        |j                  d|j                  › �¬«      ‚w xY w)Nz9Received non-JSON response from Gemini Interactions API: rI   Ú	completedz:Gemini transcription interaction did not complete (status=z): c              3   óx   K  — | ]2  }|j                   D ]!  }|j                  d k(  r|j                  �|–— Œ# Œ4 y­w)ÚtextN)ÚcontentrU   rh   )r3   Ústepri   s      r(   r7   zXGeminiAudioTranscriptionConfig.transform_audio_transcription_response.<locals>.<genexpr>“   sF   è ø€ ò %
àØŸ<™<ò%
ð Ø�|‰|˜vÒ%¨'¯,©,Ð*Bô ð%
Øñ%
ùs   ‚8:ú c              3   ó<   K  — | ]  }|j                   xs d –— Œ y­w)Ú N©rh   )r3   ri   s     r(   r7   zXGeminiAudioTranscriptionConfig.transform_audio_transcription_response.<locals>.<genexpr>™   s   è ø€ Ò=nÐU\¸g¿l¹lÒ>PÈbÓ>PÑ=nùs   ‚rn   Ú
transcribeÚtaskc              3   ó^   •K  — | ]$  }|j                   D ]  }t        |«      xŠ�‰–— Œ Œ& y ­wr2   )ÚannotationsÚ_annotation_to_word)r3   ri   Ú
annotationÚwords      €r(   r7   zXGeminiAudioTranscriptionConfig.transform_audio_transcription_response.<locals>.<genexpr>›   sD   øè ø€ ò 
àØ%×1Ñ1ò
ð Ü+¨JÓ7Ð7�ÐDô ð
Øñ
ùs   ƒ*-ÚwordséÿÿÿÿÚendÚdurationc              3   óR   K  — | ]  }|j                   d k(  r|j                  –— Œ! y­w)rT   N)ÚmodalityÚtokens)r3   Úby_modalitys     r(   r7   zXGeminiAudioTranscriptionConfig.transform_audio_transcription_response.<locals>.<genexpr>§   s,   è ø€ ò &àØ×'Ñ'¨7Ò2ð ×"Õ"ñ&ùs   ‚%'r|   )Úaudio_tokensÚtext_tokens)rU   Úinput_tokensÚoutput_tokensÚtotal_tokensÚinput_token_details)ÚjsonÚ
ValueErrorr   r?   rh   r   Úmodel_validateÚstatusr9   Ústepsr   ÚjoinÚlistÚgetÚusageÚsumÚinput_tokens_by_modalityr   Útotal_input_tokensÚtotal_output_tokensr‚   r   )
r'   rd   Úresponse_jsonÚparsedÚtext_contentsÚresponserv   Úlast_word_endr~   ru   s
            @r(   Ú&transform_audio_transcription_responsezEGeminiAudioTranscriptionConfig.transform_audio_transcription_response‚   s»  ø€ ð	Ø#/×#4Ñ#4Ó#6ˆMô ?×MÑMÈmÓ\ˆØ�=‰=˜KÒ'ÜØ(×4Ñ4ØTÐU[×UbÑUbÐTcÐcfÐgs×gxÑgxÐfyÐzôð ô  %ñ %
àŸ™ô%
ó  
ˆô 0°S·X±XÑ=nÐ`mÔ=nÓ5nÔoˆØ'ˆ�ÑÜó 
à(ô
ó 
ˆñ Ü $ U£ˆH�WÑØ#(¨¡9§=¡=°Ó#7ˆMØÐ(Ø'4�˜Ñ$Ø�<‰<Ð#Ü"%ñ &à#)§<¡<×#HÑ#Hô&ó #ˆLô
 <ØØ#Ÿ\™\×<Ñ<Ø$Ÿl™l×>Ñ>Ø#Ÿ\™\×6Ñ6Ü$MØ!-Ø &§¡× ?Ñ ?À,Ñ Nô%ô	ˆHŒNð ˆøô] ò 	ÜØ(×4Ñ4ØSÐT`×TeÑTeÐSfÐgôð ð	ús   ƒF Æ.F?)NNr2   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrrŠ   r   r)   ÚpropertyÚboolr,   r   Úobjectr;   r=   Úintr   r   rC   r   r   rL   rQ   r   r   rc   r   r   r–   r&   r*   r(   r   r   (   s  „ ñðJØðJà	Ð4Ñ	5óJð
 ð¨Tò ó ðð	;à# C¨ KÑ0ð	;ð !  f Ñ-ð	;ð ð		;ð
 ð	;ð 
ó	;ð\àð\ð ð\ð ˜‘ð	\ð
 
ó\ð #Ø#ñ
à˜˜c˜Ñ"ð
ð ð
ð Ð+Ñ,ð	
ð
 !  f Ñ-ð
ð    V Ñ,ð
ð �t‘ð
ð ˜‘*ð
ð 
ó
ð< #ñ
:à˜‘*ð
:ð �t‘ð
:ð ð	
:ð
 !  f Ñ-ð
:ð    V Ñ,ð
:ð �t‘ð
:ð 
ó
:ðAàðAð ðAð !  f Ñ-ð	Að
    V Ñ,ðAð 
'óAð(4àð4ð 
ô4r*   r   Ú_EMPTY_TRANSCRIPTION_CONFIGÚmodeÚverbatim)ru   Úspeaker)rU   r%   Údiarization_modeÚ_WORD_TIMESTAMP_CONFIGr    rX   rY   r!   c                 óh   — |s| j                  d«      |fdœ}|S | j                  d«      |fd|idœ}|S )Nzgemini/)r    ÚinputrY   )r    r§   Úgeneration_config)Úremoveprefix)r    rX   rY   Úbare_requestÚconfigured_requests        r(   r_   r_   Ã   sW   € ñ
  à×'Ñ'¨	Ó2Ø!�^ñF
ˆð Ðà×#Ñ# IÓ.Ø�Ø4Ð6JÐKñHÐð
 Ðr*   r#   c                 óR   — t        | t        «      r| st        S dt        | «      fi}|S )NÚlanguage_codes)Ú
isinstancer›   r    r	   )r#   Úlanguage_configs     r(   Ú_language_configr°   Ö   s1   € Ü�h¤Ô$©HÜ*Ð*àÔDÀXÓNÐPð9€Oð Ðr*   r%   r$   c                 ó‚   — t        | t        «      xr d| v xs t        |t        «      xr |t        v }|rt        S t
        S )Nru   )r®   rŠ   r›   r   r¥   r    )r%   r$   Úwants_word_timestampss      r(   Ú_timestamp_configr³   ß   sI   € äÐ*¬DÓ1ÒW°fÐ@WÐ6Wò$]ä
�_¤cÓ
*Ò
[¨ÔB[Ð/[ð ñ &;Ô!Ð[Ô@[Ð[r*   r.   c                 ó’   — i t        | j                  d«      «      ¥t        | j                  d«      | j                  d«      «      ¥}|S )Nr#   r%   r$   )r°   r‹   r³   )r.   rY   s     r(   r`   r`   æ   sQ   € ð>Ü
˜?×.Ñ.¨zÓ:Ó
;ð>ä
˜O×/Ñ/Ð0IÓJÈO×L_ÑL_Ð`qÓLrÓ
sð>Ðð  Ðr*   rt   c                 ó  — | j                   t        k7  s| j                  €y d| j                  fdt        | j                  «      fdt        | j
                  «      fd| j                  ff}|D ��ci c]  \  }}|€Œ	||“Œ c}}S c c}}w )Nru   Ústartrx   r£   )rU   r   rh   Ú_parse_offset_secondsÚstart_offsetÚ
end_offsetr£   )rt   ÚentriesÚkeyÚvalues       r(   rs   rs   î   s‡   € Ø‡�Ô3Ò3°z·±Ð7NØà	�—‘Ð!Ø	Ô'¨
×(?Ñ(?Ó@ÐAØ	Ô% j×&;Ñ&;Ó<Ð=Ø	�J×&Ñ&Ð'ð	€Gð *1×F™:˜3 °EÑ4EˆC�‰JÓFÐFùÓFs   Á.
BÁ9BÚoffsetc                 óf   — | �| j                  d«      sy 	 t        | d d «      S # t        $ r Y y w xY w)NÚsrw   )ÚendswithÚfloatr…   )r½   s    r(   r·   r·   ú   s=   € Ø€~˜VŸ_™_¨SÔ1ØðÜ�V˜C˜R�[Ó!Ð!øÜò Ùðús   –$ ¤	0¯0)3rZ   Úcollections.abcr   r   Útypingr   Úhttpxr   r   Ú5litellm.litellm_core_utils.audio_utils.subtitle_utilsr   Ú,litellm.litellm_core_utils.audio_utils.utilsr	   r
   Ú8litellm.llms.base_llm.audio_transcription.transformationr   r   Ú)litellm.llms.base_llm.chat.transformationr   Ú litellm.llms.gemini.common_utilsr   r   Ú-litellm.types.llms.gemini_audio_transcriptionr   r   r   r   r   Úlitellm.types.llms.openair   r   Úlitellm.types.utilsr   r   r   r   r   Ú__annotations__r   r   r    r¥   r›   r_   rž   r°   r³   r`   rÁ   rs   r·   r&   r*   r(   ú<module>rÎ      sf  ðÜ ß -Ý ç #å [÷÷õ Gß I÷õ ÷÷ó ð $0Ð ˜5Ó /Ø#.Ð ˜5Ó .ôNÐ%Aô Nðb ACÐ ˜UÐ#<Ñ=Ó Bà
ØØ#,Ø%ñð<Ð ˜Ð7Ñ8ó ðØðà.ðð 4ðð +ó	ð&˜vð Ð*Có ð\¨vð \Èð \ÐSló \ð °¸¸f¸Ñ1Eð  ÐJcó  ð	GÐ$Eð 	GÈ'ÐRUÐWZÐ]bÑWbÐRbÑJcÐfjÑJjó 	Gð #¨¡*ð °¸±ô r*   