Ë
    uPêjgF  ã                   óÎ  — U d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZ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mZ ddlmZ e	rddlmZ  dZ!ee"d<   e!dz  Z#ee"d<   dZ$ G d„ de«      Z% G d„ de«      Z& G d„ de«      Z' G d„ de«      Z( G d„ de«      Z) G d„ de«      Z* G d„ de«      Z+d ed!ed"e%f   fd#„Z,d$ed!e+fd%„Z- G d&„ d'«      Z.d!e/eef   fd(„Z0y))a]  
NVIDIA Riva STT handler.

This module bridges litellm's transcription dispatch to NVIDIA Riva's gRPC
streaming ASR API. We do *not* go through ``base_llm_http_handler`` because
Riva is gRPC-only: HTTP-shaped abstractions (``httpx.Response``,
``api_base/v1/...`` URLs, multipart bodies) do not apply.

The handler is intentionally a thin orchestration layer:

1. Resample the inbound audio to 16 kHz mono LINEAR_PCM (Riva's required
   wire format).
2. Build ``RecognitionConfig`` / ``StreamingRecognitionConfig`` protobufs
   from the structured dict produced by
   :class:`NvidiaRivaAudioTranscriptionConfig`.
3. Construct ``riva.client.Auth`` honoring NVCF (function-id metadata + TLS)
   vs self-hosted (any host:port, optional TLS) modes.
4. Stream the audio through Riva's ``streaming_response_generator`` and
   aggregate ``is_final`` results into a single transcript.
5. Return a normalized ``TranscriptionResponse`` with ``duration`` exposed
   on ``_hidden_params`` so cost calculation works.

``riva-client`` is imported lazily so ``litellm`` core remains usable
without the optional STT extras installed.
é    N)ÚCallableÚIterable)Ú
ModuleType)ÚTYPE_CHECKINGÚAnyÚFinalÚProtocol)Úget_audio_file_nameÚprocess_audio_file)Úresample_to_riva_pcm)ÚRIVA_TARGET_NUM_CHANNELSÚRIVA_TARGET_SAMPLE_RATE_HZÚ"NvidiaRivaAudioTranscriptionConfig)ÚNvidiaRivaExceptionÚgrpc_error_to_litellm_exception)Ú	FileTypesÚTranscriptionResponse)Ú convert_to_model_response_object)ÚLoggingi@  Ú_DEFAULT_CHUNK_SAMPLESé   Ú_DEFAULT_CHUNK_BYTESz[NVIDIA Riva client is not installed. Install with `pip install 'litellm[stt-nvidia-riva]'`.c                   ó   — e Zd ZdZy)Ú	_RivaAuthz#Opaque ``riva.client.Auth`` handle.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úy/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/nvidia_riva/audio_transcription/handler.pyr   r   C   s   „ Ú-r!   r   c                   ó2   — e Zd Zededee   f   fd„«       Zy)Ú_AsrServiceÚreturn.c                  ó   — y ©Nr    ©Úselfs    r"   Ústreaming_response_generatorz(_AsrService.streaming_response_generatorH   s   € ØORr!   N)r   r   r   Úpropertyr   r   Úobjectr*   r    r!   r"   r$   r$   G   s$   „ ØØR¨h°s¸HÀVÑ<LÐ7LÑ.MÒRó ÙRr!   r$   c                   ó   — e Zd ZdZy)Ú_EndpointingConfigz.Opaque ``EndpointingConfig`` protobuf message.Nr   r    r!   r"   r.   r.   L   s   „ Ú8r!   r.   c                   ó$   — e Zd ZU eegdf   ed<   y)Ú_EndpointingConfigFieldNÚCopyFrom)r   r   r   r   r.   Ú__annotations__r    r!   r"   r0   r0   P   s   … ØÐ*Ð+¨TÐ1Ñ2Ô2r!   r0   c                   ó"   — e Zd Zedefd„«       Zy)Ú_RecognitionConfigr%   c                  ó   — y r'   r    r(   s    r"   Úendpointing_configz%_RecognitionConfig.endpointing_configU   s   € Ø=@r!   N)r   r   r   r+   r0   r6   r    r!   r"   r4   r4   T   s   „ ØØ@Ð$;Ò@ó Ù@r!   r4   c                   ó   — e Zd ZdZy)Ú_StreamingRecognitionConfigz7Opaque ``StreamingRecognitionConfig`` protobuf message.Nr   r    r!   r"   r8   r8   Y   s   „ ÚAr!   r8   c                   ó"   — e Zd Zedefd„«       Zy)Ú_AudioEncodingr%   c                  ó   — y r'   r    r(   s    r"   Ú
LINEAR_PCMz_AudioEncoding.LINEAR_PCM^   s   € Ø$'r!   N)r   r   r   r+   r,   r<   r    r!   r"   r:   r:   ]   s   „ ØØ'˜FÒ'ó Ù'r!   r:   Úriva_moduler%   .c                 ó   — | j                   S r'   )ÚAuth)r=   s    r"   Ú_auth_factoryr@   b   s   € Ø×ÑÐr!   Úriva_asr_modulec                 ó   — | j                   S r'   )ÚAudioEncoding)rA   s    r"   Ú_audio_encodingrD   f   s   € Ø×(Ñ(Ð(r!   c                   óŽ  — e Zd ZdZ	 	 ddedededededed	d
dedz  dedz  de	de
dz  fd„Z	 ddedededededed	d
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eded	d
dedz  dedz  de
de	defd„Zdedededz  dedef
d„Zdedeeef   defd„Zededef   de	fd„«       Zedefd„«       Zedeeeef      fd„«       Zy)!ÚNvidiaRivaAudioTranscriptionz&Sync + async entry point for Riva ASR.NÚmodelÚ
audio_fileÚoptional_paramsÚlitellm_paramsÚmodel_responseÚtimeoutÚlogging_objÚLiteLLMLoggingObjÚapi_keyÚapi_baseÚatranscriptionÚprovider_configc                 óŒ   — |€
t        «       }|
r| j                  |||||||||	|¬«
      S | j                  |||||||||	||
¬«      S )N)
rG   rH   rI   rJ   rK   rL   rM   rO   rP   rR   ©rG   rH   rI   rJ   rK   rL   rM   rO   rP   rR   rQ   )r   Úasync_audio_transcriptionsÚ	_run_sync)r)   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rQ   rR   s               r"   Úaudio_transcriptionsz1NvidiaRivaAudioTranscription.audio_transcriptionsm   s„   € ð Ð"Ü@ÓBˆOáØ×2Ñ2ØØ%Ø /Ø-Ø-ØØ'ØØ!Ø /ð 3ó ð ð �~‰~ØØ!Ø+Ø)Ø)ØØ#ØØØ+Ø)ð ó 
ð 	
r!   r%   c              ƒ   óŒ   K  — t        j                  | j                  |||||||||	|
xs
 t        «       d¬«      ƒ d {  –—† S 7 Œ­w)NTrT   )ÚasyncioÚ	to_threadrV   r   )r)   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rR   s              r"   rU   z7NvidiaRivaAudioTranscription.async_audio_transcriptionsš   sV   è ø€ ô ×&Ñ&Ø�N‰NØØ!Ø+Ø)Ø)ØØ#ØØØ+ÒSÔ/QÓ/SØô
÷ 
ð 	
ð 
ús   ‚;A½A¾Ac                 óª  — |	st        dd¬«      ‚t        |«      }t        |j                  «      }|
j	                  |||i |¥|	|dœ¥¬«      j
                  }t        |t        «      st        dd¬«      ‚|d   }t        |d	<   t        |d
<   d|d<   |j                  d«      xs d}|j                  d«      }t        «       \  }}| j                  ||	||¬«      }| j                  ||¬«      }|j                  |d¬«      }|j                  d ||	||t!        |j                  d«      «      |j                  d«      dœdœ¬«       	 |j#                  |«      }| j%                  |j&                  «      }||dœ}|�)| j)                  |j*                  «      rt-        |«      |d<    |j*                  d"i |¤Ž}| j/                  |«      }t5        j6                  |||j8                  |¬«      }t        |«      }|j;                  t=        |«      |d|i|¬«       |d|j8                  dœ}t?        |||d ¬!«      } | S # t         $ r ‚ t0        $ r}t3        |«      |‚d }~ww xY w)#Ni�  z®NVIDIA Riva requires `api_base` (host:port for the gRPC endpoint, e.g. `grpc.nvcf.nvidia.com:443` or `localhost:50051`). Set it in litellm_params or via NVIDIA_RIVA_API_BASE.©Ústatus_codeÚmessage)rP   rO   )rG   rH   rI   rJ   éô  zONvidiaRivaAudioTranscriptionConfig produced an unexpected request payload type.Úrecognition_configÚsample_rate_hertzÚaudio_channel_countr<   ÚencodingÚresponse_formatÚjsonÚtimestamp_granularities)r=   rP   rO   rI   )rA   Úrecognition_config_dictF)ÚconfigÚinterim_resultsÚnvcf_function_idÚuse_ssl)r`   Únvcf_function_id_setrk   )rP   rQ   Úcomplete_input_dict)ÚinputrO   Úadditional_args)Úaudio_chunksÚstreaming_configrL   )Úfinal_resultsrd   Úduration_secondsrf   rm   )rn   rO   ro   Úoriginal_responseÚnvidia_riva)rG   Úcustom_llm_providerÚaudio_transcription_durationÚaudio_transcription)Úresponse_objectÚmodel_response_objectÚhidden_paramsÚresponse_typer    ) r   r   r   Úfile_contentÚ%transform_audio_transcription_requestÚdataÚ
isinstanceÚdictr   r   ÚgetÚ_import_rivaÚ_construct_authÚ_build_recognition_config_protoÚStreamingRecognitionConfigÚpre_callÚboolÚ
ASRServiceÚ_iter_audio_chunksÚ	pcm_bytesÚ_supports_timeout_kwargr*   ÚfloatÚ_collect_final_resultsÚ	Exceptionr   r   Úbuild_transcription_responsers   Ú	post_callr
   r   )!r)   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rR   rQ   Ú	processedÚ	resampledÚrequest_payloadrg   rd   rf   r=   rA   Úauth_objr`   rq   Úasr_servicerp   Ústream_kwargsÚstreamrr   ÚeÚtranscriptionÚstringified_responser{   Úfinal_responses!                                    r"   rV   z&NvidiaRivaAudioTranscription._run_sync¸   sù  € ñ Ü%Øð,ôð ô .¨jÓ9ˆ	Ü/°	×0FÑ0FÓGˆ	à!0×!VÑ!VØØ!Ø+ðØ ðà$Ø"òð	 "Wó 	"
÷ ‰$ð 	ô ˜/¬4Ô0Ü%ØØiôð ð
 :IÐI]Ñ9^Ðô 8RÐÐ 3Ñ4Ü9QÐÐ 5Ñ6Ø.:Ð 
Ñ+à!0×!4Ñ!4Ð5FÓ!GÒ!QÈ6ˆØ)8×)<Ñ)<Ð=VÓ)WÐä'3£~Ñ$ˆ�_Ø×.Ñ.Ø#ØØØ+ð	 /ó 
ˆð %)×$HÑ$HØ+Ø$;ð %Ió %
Ðð @O×?iÑ?iØ%°uð @jó @
Ðð 	×ÑØØà$Ø"0à*AÜ,0°×1DÑ1DÐEWÓ1XÓ,YØ.×2Ñ2°9Ó=ñ(ñð 	ô 	
ð	<Ø.9×.DÑ.DÀXÓ.NˆKØ"&×"9Ñ"9¸)×:MÑ:MÓ"NˆLà ,Ø$4ñ7ˆMð Ð" t×'CÑ'CÀK×DlÑDlÔ'mÜ+0°«>�˜iÑ(ØD˜K×DÑDÑUÀ}ÑUˆFØ#'×#>Ñ#>¸vÓ#FˆMô  B×^Ñ^Ø'Ø+Ø&×7Ñ7Ø$;ô	 
ˆô '+¨=Ó&9Ðà×ÑÜ% jÓ1ØØ2Ð4KÐLØ2ð	 	ô 	
ð Ø#0Ø,5×,FÑ,Fñ 
ˆô 8XØ0Ø"0Ø'Ø/ô	8
ˆð ÐøôE #ò 	ØÜò 	<Ü1°!Ó4¸!Ð;ûð	<ús   ÅA?H/ È/IÉIÉIr=   c                 óV  — |j                  d«      }|j                  d«      }|�t        |«      n
t        |«      }g }|r|j                  dt        |«      f«       |r|j                  dd|› �f«       	  t	        |«      |||¬«      S # t
        $ r  t	        |«      d|||«      cY S w xY w)uÚ  
        Build a ``riva.client.Auth`` object.

        - When ``nvcf_function_id`` is provided we attach the NVCF
          ``function-id`` and bearer ``authorization`` metadata, and default
          ``use_ssl`` to True (NVCF endpoints are TLS-only).
        - Otherwise (self-hosted) we default ``use_ssl`` to False but still
          honor an explicit override â€” self-hosted Riva behind an ingress
          with TLS termination is a real deployment topology.
        rj   rk   Nzfunction-idÚauthorizationzBearer )Úurirk   Úmetadata_args)r‚   rˆ   ÚappendÚstrr@   Ú	TypeError)	r)   r=   rP   rO   rI   rj   Úuse_ssl_overriderk   Úmetadatas	            r"   r„   z,NvidiaRivaAudioTranscription._construct_auth>  sÀ   € ð" #2×"5Ñ"5Ð6HÓ"IÐØ"1×"5Ñ"5°iÓ"@ÐØ3CÐ3OœÐ.Ô/ÔUYÐZjÓUkˆà13ˆÙØ�O‰O˜]¬CÐ0@Ó,AÐBÔCÙØ�O‰O˜_°¸°yÐ.AÐBÔCð	QØ-”= Ó-°(ÀGÐ[cÔdÐdøÜò 	Qà-”= Ó-¨d°G¸XÀxÓPÒPð	Qús   Á4B ÂB(Â'B(rA   rg   c                 óò  — |j                  d«      xs dj                  «       }t        t        |«      |t        |«      j                  «      }|j                  |t        |d   «      |d   t        |d   «      t        |j                  dd«      «      t        |j                  dd	«      «      t        |j                  d
d«      «      |j                  dd«      xs dt        |j                  dd	«      «      t        |j                  dd	«      «      ¬«
      }|j                  d«      }t        |t        «      r2|r0	  |j                  di |¤Ž}|j                  j                  |«       |S |S # t        $ r Y |S w xY w)Nrc   r<   ra   Úlanguage_coderb   Úenable_automatic_punctuationTÚenable_word_time_offsetsFÚmax_alternativesé   rG   Ú Úverbatim_transcriptsÚprofanity_filter)
rc   ra   r§   rb   r¨   r©   rª   rG   r­   r®   r6   r    )r‚   ÚupperÚgetattrrD   r<   ÚRecognitionConfigÚintrˆ   r€   r�   ÚEndpointingConfigr6   r1   r�   )r)   rA   rg   Úencoding_nameÚencoding_enumrh   ÚendpointingÚeps           r"   r…   z<NvidiaRivaAudioTranscription._build_recognition_config_proto_  s‡  € ð !8× ;Ñ ;¸JÓ GÒ WÈ<×^Ñ^Ó`ˆÜ'.Ü˜OÓ,ØÜ˜OÓ,×7Ñ7ó(
ˆð -<×,MÑ,MØ"Ü!Ð"9Ð:MÑ"NÓOØ1°/ÑBÜ #Ð$;Ð<QÑ$RÓ SÜ)-Ð.E×.IÑ.IÐJhÐjnÓ.oÓ)pÜ%)Ð*A×*EÑ*EÐF`ÐbgÓ*hÓ%iÜ Ð!8×!<Ñ!<Ð=OÐQRÓ!SÓTØ)×-Ñ-¨g°rÓ:Ò@¸bÜ!%Ð&=×&AÑ&AÐBXÐZ_Ó&`Ó!aÜ!Ð"9×"=Ñ"=Ð>PÐRWÓ"XÓYð -Nó -
ˆð 5×8Ñ8Ð9MÓNˆÜ�k¤4Ô(©[ðØ0Q°×0QÑ0QÑ0`ÐT_Ñ0`�Ø×)Ñ)×2Ñ2°2Ô6ð ˆˆvˆøô ò ð àˆðús   Ä8-E) Å)	E6Å5E6Úcallable_obj.c                 óº   — 	 t        j                  | «      }|j                  }d|v ryt        d„ |j                  «       D «       «      S # t        t        f$ r Y yw xY w)NFrL   Tc              3   ój   K  — | ]+  }|j                   t        j                  j                  k(  –— Œ- y ­wr'   )ÚkindÚinspectÚ	ParameterÚVAR_KEYWORD)Ú.0Úps     r"   ú	<genexpr>zGNvidiaRivaAudioTranscription._supports_timeout_kwarg.<locals>.<genexpr>Œ  s%   è ø€ ÒT¸q�1—6‘6œW×.Ñ.×:Ñ:Õ:ÑTùs   ‚13)r¼   Ú	signaturer£   Ú
ValueErrorÚ
parametersÚanyÚvalues)r¸   ÚsigÚparamss      r"   rŒ   z4NvidiaRivaAudioTranscription._supports_timeout_kwargƒ  s]   € ð	Ü ×*Ñ*¨<Ó8ˆCð Ÿ™ˆØ˜ÑØÜÑTÀFÇMÁMÃOÔTÓTÐTøô œ:Ð&ò 	Ùð	ús   ‚A ÁAÁAr‹   c              #   óp   K  — t        dt        | «      t        «      D ]  }| ||t        z    }|sŒ|–— Œ y ­w)Nr   )ÚrangeÚlenr   )r‹   ÚoffsetÚchunks      r"   rŠ   z/NvidiaRivaAudioTranscription._iter_audio_chunksŽ  s@   è ø€ ä˜Aœs 9›~Ô/CÓDò 	ˆFØ˜f vÔ0DÑ'DÐEˆEÙØØ‹Kñ		ùs   ‚46c                 ó´  — g }| D ]Ð  }t        |dd«      xs g }|D ]¸  }t        |dd«      sŒt        |dd«      xs g }|sŒ%|d   }t        |dd«      xs d}t        |d	d«      xs g }g }	|D ]R  }
|	j                  t        |
d
d«      t        t        |
dd«      xs d«      t        t        |
dd«      xs d«      dœ«       ŒT |j                  ||	dœ«       Œº ŒÒ |S )a  
        Walk the gRPC stream, ignore empty / non-final chunks, and return a
        list of normalized final-result dicts. Matching the user's note: the
        ``id`` blocks with no ``results`` are streaming heartbeats and must
        be skipped.
        ÚresultsNÚis_finalFÚalternativesr   Ú
transcriptr¬   ÚwordsÚwordÚ
start_timeÚend_time)rÔ   Ústart_time_msÚend_time_ms)rÒ   rÓ   )r°   r¡   r²   )r˜   rr   ÚresponserÏ   ÚresultrÑ   ÚtoprÒ   Úwords_protorÓ   rÔ   s              r"   rŽ   z3NvidiaRivaAudioTranscription._collect_final_results–  s  € ð 9;ˆØò 	QˆHÜ˜h¨	°4Ó8Ò>¸BˆGØ!ò Q�Ü˜v z°5Ô9ØÜ& v¨~¸tÓDÒJÈ�Ù#ØØ" 1‘o�Ü$ S¨,¸Ó;ÒA¸r�
Ü% c¨7°DÓ9Ò?¸R�Ø�Ø'ò �DØ—L‘Lä$+¨D°&¸"Ó$=Ü-0´¸¸|ÈQÓ1OÒ1TÐSTÓ-UÜ+.¬w°t¸ZÈÓ/KÒ/PÈqÓ+Qñõðð ×$Ñ$°JÈÑ%OÕPñ%Qð	Qð* Ðr!   )FNr'   )F)r   r   r   r   r¢   r   r�   r   r�   rˆ   r   rW   rU   rV   r   r   r„   r   r4   r…   Ústaticmethodr   r,   rŒ   ÚbytesrŠ   ÚlistrŽ   r    r!   r"   rF   rF   j   s�  „ Ù0ð  %ØEIñ+
àð+
ð ð+
ð ð	+
ð
 ð+
ð .ð+
ð ð+
ð )ð+
ð �t‘ð+
ð ˜‘*ð+
ð ð+
ð <¸dÑBó+
ðp FJñ
àð
ð ð
ð ð	
ð
 ð
ð .ð
ð ð
ð )ð
ð �t‘ð
ð ˜‘*ð
ð <¸dÑBð
ð 
ó
ðT  %ñDàðDð ðDð ð	Dð
 ðDð .ðDð ðDð )ðDð �t‘ðDð ˜‘*ðDð <ðDð ðDð 
óDðLQàðQð ðQð �t‘ð	Qð
 ðQð 
óQðB"Ø)ð"ØDHÈÈcÈÁNð"à	ó"ðH ðU¨h°s¸F°{Ñ.Cð UÈò Uó ðUð ð eò ó ðð ð¨$¨t°C¸°KÑ/@Ñ*Aò ó ñr!   rF   c                  óÚ   — 	 ddl m}  | }t        |d«      s	 ddlm} |}| |fS | |fS # t        $ r}t        dt        ¬«      |‚d}~ww xY w# t        $ r}t        dt        ¬«      |‚d}~ww xY w)zâ
    Lazy import of ``riva.client`` and ``riva.client.proto.riva_asr_pb2``.

    We try the SDK first (preferred) and fall back to importing the proto
    module separately when the SDK packaging changes between versions.
    r   Nr_   r\   r±   )Úriva_asr_pb2)Úriva.clientÚclientÚImportErrorr   Ú_RIVA_INSTALL_HINTÚhasattrÚriva.client.protorá   )Úriva_clientr™   rA   rá   s       r"   rƒ   rƒ   ·  s‹   € ðVÝ)ð "€OÜ�?Ð$7Ô8ð	ZÝ6à*ˆOð ˜Ð'Ð'ˆ;˜Ð'Ð'øô ò VÜ!¨cÔ;MÔNÐTUÐUûðVûô ò 	ZÜ%°#Ô?QÔRÐXYÐYûð	Zús+   ‚' —A
 §	A°AÁAÁ
	A*ÁA%Á%A*)1r   rY   r¼   Úcollections.abcr   r   Útypesr   Útypingr   r   r   r	   Ú,litellm.litellm_core_utils.audio_utils.utilsr
   r   Ú8litellm.llms.nvidia_riva.audio_transcription.audio_utilsr   Ú;litellm.llms.nvidia_riva.audio_transcription.transformationr   r   r   Ú%litellm.llms.nvidia_riva.common_utilsr   r   Úlitellm.types.utilsr   r   Úlitellm.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   rN   r   r2   r   rå   r   r$   r.   r0   r4   r8   r:   r@   rD   rF   Útuplerƒ   r    r!   r"   ú<module>rô      s  ðòó4 Û ß .Ý ß 6Ó 6÷õ÷ñ ÷
÷ AÝ :áõð !%Ð ˜Ó $Ø4°qÑ8Ð �eÓ 8ð sÐ ô.�ô .ôS�(ô Sô
9˜ô 9ô3˜hô 3ôA˜ô Aô
B (ô Bô(�Xô (ð
˜zð ¨h°s¸I°~Ñ.Fó ð) Zð )°Nó )÷Jñ JðZ
(�e˜J¨
Ð2Ñ3ô (r!   