Ë
    uPêjû)  ã                   óØ   — U d Z ddlmZ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mZmZmZmZ ddlmZmZ ddlmZmZ g d	¢Zeee      ed
<   g d¢Zeee      ed<    G d„ de	«      Zy)a  
Translates between OpenAI's `/v1/audio/transcriptions` shape and Soniox's
async transcription API (https://soniox.com/docs/stt/async/async-transcription).

This config covers parameter mapping, env validation and response shaping.
The actual orchestration (file upload -> create -> poll -> fetch -> cleanup)
lives in `litellm.llms.soniox.audio_transcription.handler`, because Soniox's
async API requires multiple HTTP calls and does not fit the single-request
contract of `base_llm_http_handler.audio_transcriptions`.
é    )ÚAnyÚFinal)ÚHeadersÚResponse)ÚAudioTranscriptionRequestDataÚBaseAudioTranscriptionConfig)ÚBaseLLMException)ÚSonioxExceptionÚget_soniox_api_baseÚget_soniox_api_keyÚrender_soniox_tokensÚrender_soniox_tokens_as_srtÚrender_soniox_tokens_as_vtt)ÚAllMessageValuesÚ&OpenAIAudioTranscriptionOptionalParams)Ú	FileTypesÚTranscriptionResponse)Úlanguage_hintsÚlanguage_hints_strictÚenable_language_identificationÚenable_speaker_diarizationÚcontextÚtranslationÚclient_reference_idÚwebhook_urlÚwebhook_auth_header_nameÚwebhook_auth_header_valueÚ	audio_urlÚfile_idÚSONIOX_PASSTHROUGH_PARAMS)Úsoniox_polling_intervalÚsoniox_max_polling_attemptsÚsoniox_cleanupÚfilenameÚSONIOX_HANDLER_ONLY_PARAMSc                   óH  — e Zd ZdZdedee   fd„Zdede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dedee   dede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dede	dz  defd„Zdededededef
d„Z	 ddededz  defd„Z	 	 ddeeef   dedz  dedz  defd„Zy)ÚSonioxAudioTranscriptionConfigz<Configuration for Soniox async speech-to-text transcription.ÚmodelÚreturnc                 ó
   — ddgS )NÚlanguageÚresponse_format© )Úselfr(   s     ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/soniox/audio_transcription/transformation.pyÚget_supported_openai_paramsz:SonioxAudioTranscriptionConfig.get_supported_openai_params@   s   € ð Ð-Ð.Ð.ó    Únon_default_paramsÚoptional_paramsÚdrop_paramsc                 óä   — d|v r:|d   r5|d   }|j                  d«      }|s|g|d<   n||vr|gt        |«      z   |d<   d|v r|d   |d<   t        t        z   D ]  }||v sŒ||   €Œ||   ||<   Œ |S )Nr+   r   r,   )ÚgetÚlistr    r%   )r.   r2   r3   r(   r4   r+   Úexisting_hintsÚkeys           r/   Úmap_openai_paramsz0SonioxAudioTranscriptionConfig.map_openai_paramsF   s½   € ð Ð+Ñ+Ð0BÀ:Ò0NØ0°Ñ<ˆHØ$3×$7Ñ$7Ð8HÓ$IˆNÙ!Ø5=°J�Ð 0Ò1Ø Ñ/Ø5=°JÄÀnÓAUÑ4U�Ð 0Ñ1ð Ð 2Ñ2Ø1CÐDUÑ1VˆOÐ-Ñ.ô -Ô/IÑIò 	?ˆCØÐ(Ò(Ð-?ÀÑ-DÑ-PØ'9¸#Ñ'>� Ò$ð	?ð Ðr1   Úerror_messageÚstatus_codeÚheadersc                 ó   — t        |||¬«      S )N©Úmessager<   r=   )r
   )r.   r;   r<   r=   s       r/   Úget_error_classz.SonioxAudioTranscriptionConfig.get_error_classa   s   € Ü }À+ÐW^Ô_Ð_r1   NÚmessagesÚlitellm_paramsÚapi_keyÚapi_basec                 óp   — t        |«      }|st        ddd ¬«      ‚dd|› �i}	|r|	j                  |«       |	S )NzsMissing Soniox API key. Set the SONIOX_API_KEY environment variable or pass api_key=... to litellm.transcription().i‘  r?   ÚAuthorizationzBearer )r   r
   Úupdate)
r.   r=   r(   rB   r3   rC   rD   rE   Úresolved_keyÚmerged_headerss
             r/   Úvalidate_environmentz3SonioxAudioTranscriptionConfig.validate_environmentd   sZ   € ô 1°Ó9ˆÙÜ!ðOð  Øôð ð ˜w | nÐ5ð1
ˆñ Ø×!Ñ! 'Ô*ØÐr1   Ústreamc                 ó   — t        |«      S ©N)r   )r.   rE   rD   r(   r3   rC   rL   s          r/   Úget_complete_urlz/SonioxAudioTranscriptionConfig.get_complete_url€   s   € ô # 8Ó,Ð,r1   Ú
audio_filec                 ón   — d|i}t         D ]  }|j                  |«      }|€Œ|||<   Œ t        |dd¬«      S )a  
        Build the JSON body for `POST /v1/transcriptions`.

        The handler is responsible for the file upload (if `audio_file` is bytes)
        and for filling in `file_id`/`audio_url`. This method exists so the
        config can be exercised in isolation by unit tests.
        r(   Nzapplication/json)ÚdataÚfilesÚcontent_type)r    r6   r   )r.   r(   rP   r3   rC   Úbodyr9   Úvalues           r/   Ú%transform_audio_transcription_requestzDSonioxAudioTranscriptionConfig.transform_audio_transcription_request�   sN   € ð (/°Ð&6ˆä,ò 	"ˆCØ#×'Ñ'¨Ó,ˆEØÑ Ø!��S’	ð	"ô
 -°$¸dÐQcÔdÐdr1   Úraw_responseÚmodel_responsec           
      óº   — 	 |j                  «       }| j	                  ||¬«      S # t        $ r,}t        d|› �t        |dd«      t        |dd«      ¬«      ‚d}~ww xY w)az  
        Build a TranscriptionResponse from a Soniox transcript payload.

        `raw_response.json()` may be either:
          - a Soniox transcript object: `{"id": "...", "text": "...", "tokens": [...]}`
          - or a merged envelope: `{"transcription": {...}, "transcript": {...}}`
            produced by the handler so transcription metadata is also available.
        z!Failed to parse Soniox response: r<   iô  r=   Nr?   )rY   )ÚjsonÚ	Exceptionr
   ÚgetattrÚ_build_response_from_payload)r.   rX   rY   ÚpayloadÚexcs        r/   Ú&transform_audio_transcription_responsezESonioxAudioTranscriptionConfig.transform_audio_transcription_response¤   sn   € ð	Ø)×.Ñ.Ó0ˆGð ×0Ñ0°ÈÐ0ÓXÐXøô ò 	Ü!Ø;¸C¸5ÐAÜ# L°-ÀÓEÜ ¨i¸Ó>ôð ûð	ús   ‚% ¥	A®'AÁAr_   r,   c                 óÒ  — i }t        |t        «      r/d|v r+|j                  d«      xs i }|j                  d«      xs i }nt        |t        «      r|ni }|j                  d«      xs g }|dk(  r|rt        |«      }n}|dk(  r|rt	        |«      }njt        d„ |D «       «      }t        d„ |D «       «      }	|s|	r|rt        |«      }n4|j                  d«      r|d   }n|rd	j                  d
„ |D «       «      }nd	}|xs t        |¬«      }
||
_	        d|
d<   |j                  d«      �	 t        |d   «      dz  |
d<   t        d„ |D «       «      }	|	rU|D �ch c]%  }|j                  d«      sŒ|j                  d«      ’Œ' }}t        |«      dk(  rt        t        |«      «      |
d<   |dk(  r�|rg }|D ]q  }d|j                  dd	«      i}|j                  d«      �t        |d   «      dz  |d<   |j                  d«      �t        |d   «      dz  |d<   |j!                  |«       Œs |r||
d<   |
j"                  j%                  d||dœi«       |
S # t        t        f$ r Y �Œ#w xY wc c}w )z:Shared response-building logic (also used by the handler).Ú
transcriptÚtranscriptionÚtokensÚsrtÚvttc              3   óB   K  — | ]  }|j                  d «      du–— Œ y­w)ÚspeakerN©r6   ©Ú.0Úts     r/   ú	<genexpr>zNSonioxAudioTranscriptionConfig._build_response_from_payload.<locals>.<genexpr>Ú   s   è ø€ Ò$RÀa Q§U¡U¨9Ó%5¸TÔ%AÑ$Rùó   ‚c              3   óB   K  — | ]  }|j                  d «      du–— Œ y­w©r+   Nrj   rk   s     r/   rn   zNSonioxAudioTranscriptionConfig._build_response_from_payload.<locals>.<genexpr>Û   s   è ø€ ÒMÀ˜qŸu™u ZÓ0¸Ô<ÑMùro   ÚtextÚ c              3   ó@   K  — | ]  }|j                  d d«      –— Œ y­w)rr   rs   Nrj   rk   s     r/   rn   zNSonioxAudioTranscriptionConfig._build_response_from_payload.<locals>.<genexpr>â   s   è ø€ ÒA°Q˜qŸu™u V¨R×0ÑAùs   ‚)rr   Ú
transcribeÚtaskÚaudio_duration_msg     @�@Údurationc              3   óB   K  — | ]  }|j                  d «      du–— Œ y­wrq   rj   rk   s     r/   rn   zNSonioxAudioTranscriptionConfig._build_response_from_payload.<locals>.<genexpr>ò   s   è ø€ ÒI¸Q˜1Ÿ5™5 Ó,°DÔ8ÑIùro   r+   é   Úverbose_jsonÚwordÚstart_msÚstartÚend_msÚendÚwordsÚ
soniox_raw)rd   rc   )Ú
isinstanceÚdictr6   r   r   Úanyr   Újoinr   rr   ÚfloatÚ	TypeErrorÚ
ValueErrorÚlenÚnextÚiterÚappendÚ_hidden_paramsrH   )r.   r_   rY   r,   Útranscription_metarc   re   rr   Úhas_speakerÚhas_languageÚresponserm   Ú	languagesr�   ÚtokenÚ
word_entrys                   r/   r^   z;SonioxAudioTranscriptionConfig._build_response_from_payload¼   s•  € ð .0Ðô �gœtÔ$¨¸Ñ)@Ø!(§¡¨_Ó!=Ò!CÀÐØ Ÿ™ \Ó2Ò8°b‰Jä$.¨w¼Ô$=™À2ˆJà.8¯n©n¸XÓ.FÒ.LÈ"ˆð ˜eÒ#©Ü.¨vÓ6‰DØ Ò%©&Ü.¨vÓ6‰Dô "%Ñ$RÈ6Ô$RÓ!RˆKÜÑMÀfÔMÓMˆLá™|±Ü+¨FÓ3‘Ø—‘ Ô'Ø! &Ñ)‘ÙØ—w‘wÑA¸&ÔAÓA‘à�à(ÒLÔ,AÀtÔ,LˆØˆŒØ'ˆ�Ñð ×!Ñ!Ð"5Ó6ÐBðÜ',Ð-?Ð@SÑ-TÓ'UÐX^Ñ'^�˜Ñ$ô
 ÑIÀ&ÔIÓIˆÙØ;AÖW°aÀQÇUÁUÈ:ÕEV §¡ jÕ 1ÐWˆIÐWÜ�9‹~ Ò"Ü'+¬D°«OÓ'<�˜Ñ$ð ˜nÒ,±Ø13ˆEØò )�Ø.4°e·i±iÀÈÓ6KÐ-L�
Ø—9‘9˜ZÓ(Ð4Ü*/°°jÑ0AÓ*BÀVÑ*K�J˜wÑ'Ø—9‘9˜XÓ&Ð2Ü(-¨e°H©oÓ(>ÀÑ(G�J˜uÑ%Ø—‘˜ZÕ(ð)ñ Ø$)�˜Ñ!ð 	×Ñ×&Ñ&àØ%7Ø",ñðô	
ð ˆøôC œzÐ*ò Úðüò  Xs   Ä)I ÅI$Å,I$ÉI!É I!)NNrN   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr7   r   r0   r„   Úboolr:   Úintr   r	   rA   r   rK   rO   r   r   rW   r   r   ra   r   r^   r-   r1   r/   r'   r'   =   sö  „ ÙFð/°ð /¸Ð>dÑ9eó /ðà ðð ðð ð	ð
 ðð 
óð6`¨Sð `¸sð `ÈTÐT[É^ð `Ð`pó `ð #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óðF #ñ-à˜‘*ð-ð �t‘ð-ð ð	-ð
 ð-ð ð-ð �t‘ð-ð 
ó-ðeàðeð ðeð ð	eð
 ðeð 
'óeð4 8<ñYàðYð .°Ñ4ðYð 
ó	Yð6 8<Ø&*ñ	Sà�c˜3�h‘ðSð .°Ñ4ðSð ˜t™ð	Sð
 
ôSr1   r'   N)r™   Útypingr   r   Úhttpxr   r   Ú8litellm.llms.base_llm.audio_transcription.transformationr   r   Ú)litellm.llms.base_llm.chat.transformationr	   Ú litellm.llms.soniox.common_utilsr
   r   r   r   r   r   Úlitellm.types.llms.openair   r   Úlitellm.types.utilsr   r   r    r7   rš   Ú__annotations__r%   r'   r-   r1   r/   ú<module>r¥      sq   ðò	÷ ç #÷õ G÷÷ ÷÷ Aò/Ð ˜5  c¡Ñ+ó ò 0Ð ˜E $ s¡)Ñ,ó ôRÐ%Aõ Rr1   