+
    TV-j€q  ã                   ób  € ^ RI t ^ RIt^ RIHtHtHt ^ RIt^ RIHt	 ^ RI
t^ RIt^ RIHt ^ RIHt ^ RIHt ]P(                  ! RRR7       ^ R	IHt ^ R
IHt ]P2                  R 4       t]P2                  ! RR7      R 4       tR tR tR tR tR t R t! ! R R4      t"R R lt#R t$R R lt%R t&R t'R t(R t)R  t*R! t+R" t,R# t-R$ t.R% t/R@R& lt0R@R' lt1R( t2R) t3 ! R* R+4      t4R, t5RAR- lt6R. t7R/ t8R0 t9R1 t:R2 t;R3 t< ! R4 R54      t= ! R6 R74      t> ! R8 R94      t?R: t@R; tAR< tBR= tCR> tDR? tER# )Bé    N)Ú	AsyncMockÚ	MagicMockÚpatch)ÚRepositoryNotFoundError)Úread)ÚwriteÚ	multipartz-python-multipart is required for server tests)Úreason)Ú
TestClient)Úappc                  ó    € \        \        4      # ©N)r   r   © ó    Úl/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_audio/tests/test_server.pyÚclientr      s   € ä”c‹?Ðr   T)Úautousec               #   ó    "  € \        R \        R7      ;_uu_ 4       p \        4       V n        V x € RRR4       R#   + '       g   i     R# ; i5i)zmlx_audio.server.model_provider)Únew_callableN)r   r   r   Ú
load_model)Úmock_providers    r   Úmock_model_providerr      s@   é € ô 
Ø)¼	÷
õ 
à	Ü#,£;ˆÔ ØÒ÷	
÷ 
÷ 
ò 
üs   ‚Aœ:°
AºA	Á	Ac                 ó¦   € \        . R 7      Vn        V P                  R4      pVP                  ^È8X  g   Q hVP	                  4       RRR. /8X  g   Q hR# )©Úreturn_valueú
/v1/modelsÚobjectÚlistÚdataN)r   Úget_available_modelsÚgetÚstatus_codeÚjson©r   r   Úresponses   && r   Útest_list_models_emptyr&   %   sO   € ä/8ÀbÔ/IÐÔ,Ø�z‰z˜,Ó'€HØ×Ñ 3Ô&Ð&Ð&Ø�=‰=‹?˜x¨°¸Ð<Ô<Ð<Ò<r   c                 ó^  € \        R R.R7      Vn        V P                  R4      pVP                  ^È8X  g   Q hVP	                  4       pVR,          R8X  g   Q h\        VR,          4      ^8X  g   Q hVR,          ^ ,          R,          R 8X  g   Q hVR,          ^,          R,          R8X  g   Q hR# )	Úmodel1Úmodel2r   r   r   r   r   ÚidN)r   r    r!   r"   r#   Úlen)r   r   r%   r   s   &&  r   Útest_list_models_with_datar,   -   s¦   € ä/8Ø Ð)ô0ÐÔ,ð �z‰z˜,Ó'€HØ×Ñ 3Ô&Ð&Ð&Ø�=‰=‹?€DØ��>˜VÔ#Ð#Ð#Üˆt�F�|Ó Ô!Ð!Ð!Ø��<˜�?˜4Õ  HÔ,Ð,Ð,Ø��<˜�?˜4Õ  HÔ,Ð,Ò,r   c                 óº   € V P                  R 4      pVP                  ^È8X  g   Q hVP                  4       RRRR/8X  g   Q hVP                  P	                  R4       R# )ú /v1/models?model_name=test_modelÚstatusÚsuccessÚmessagez#Model test_model added successfullyÚ
test_modelN)Úpostr"   r#   r   Úassert_called_once_withr$   s   && r   Útest_add_modelr5   ;   sc   € à�{‰{Ð=Ó>€HØ×Ñ 3Ô&Ð&Ð&Ø�=‰=‹?Ø�)ØÐ8ðô ð ð ð ×"Ñ"×:Ñ:¸<ÖHr   c                 ó¦   € \        R R7      Vn        V P                  R4      pVP                  ^Ì8X  g   Q hVP                  P	                  R4       R# )Tr   r.   r2   N©r   Úremove_modelÚdeleter"   r4   r$   s   && r   Útest_remove_model_successr:   F   sG   € ä'0¸dÔ'CÐÔ$Ø�}‰}Ð?Ó@€HØ×Ñ 3Ô&Ð&Ð&Ø×$Ñ$×<Ñ<¸\ÖJr   c                 óØ   € \        R R7      Vn        V P                  R4      pVP                  R8X  g   Q hVP	                  4       RR/8X  g   Q hVP                  P                  R4       R# )Fr   z(/v1/models?model_name=non_existent_modelé”  Údetailz$Model 'non_existent_model' not foundÚnon_existent_modelN)r   r8   r9   r"   r#   r4   r$   s   && r   Útest_remove_model_not_foundr?   N   sb   € ä'0¸eÔ'DÐÔ$Ø�}‰}ÐGÓH€HØ×Ñ 3Ô&Ð&Ð&Ø�=‰=‹?˜xÐ)OÐPÔPÐPÐPØ×$Ñ$×<Ñ<Ð=QÖRr   c                 ó¦   € \        R R7      Vn        V P                  R4      pVP                  ^Ì8X  g   Q hVP                  P	                  R4       R# )Tr   z)/v1/models?model_name="test_model_quotes"Útest_model_quotesNr7   r$   s   && r   Ú%test_remove_model_with_quotes_in_namerB   W   sH   € ä'0¸dÔ'CÐÔ$Ø�}‰}ÐHÓI€HØ×Ñ 3Ô&Ð&Ð&Ø×$Ñ$×<Ñ<Ð=PÖQr   c                   ó&   a € ] tR t^_t o R tRtV tR# )ÚMockAudioResultc                ó   € Wn         W n        R # r   ©ÚaudioÚsample_rate)ÚselfÚ
audio_datarH   s   &&&r   Ú__init__ÚMockAudioResult.__init__`   s   € ØŒ
Ø&Ör   rF   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rK   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   rD   rD   _   s   ø‡ € ÷'ð 'r   rD   c                ó$   € V ^8„  d   QhR\         /# )é   Ú
input_text©Ústr)Úformats   "r   Ú__annotate__r[   e   s   € ÷ Fñ F´ñ Fr   c              +   ó@  "  € R p^pRp\         P                  ! ^ V\        W#,          4      R4      pR\         P                  ! ^\         P                  ,          V,          V,          4      ,          p\        VP                  \         P                  4      V4      x € R# 5i)é€>  é¸  Fç      à?N)ÚnpÚlinspaceÚintÚsinÚpirD   ÚastypeÚfloat32)rW   ÚkwargsrH   ÚdurationÚ	frequencyÚtrJ   s   &,     r   Ú sync_mock_audio_stream_generatorrk   e   sq   é € Ø€KØ€HØ€IÜ
�Š�A�x¤ [Õ%;Ó!<¸eÓD€AØ”r—v’v˜a¤"§%¡%�i¨)Õ3°aÕ7Ó8Õ8€JÜ
˜*×+Ñ+¬B¯J©JÓ7¸Ó
EÔEùs   ‚BBc                 óZ  € \        4       p\        \        R 7      Vn        \        VR7      Vn        RRRRRR/pV P	                  RVR	7      pVP
                  ^È8X  g   Q hVP                  R
,          P                  4       R8X  g   Q hVP                  R,          P                  4       R8X  g   Q hVP                  P                  R4       VP                  P                  4        VP                  P                  w  rVV^ ,          VR,          8X  g   Q hVP                  R4      VR,          8X  g   Q h \        \        P                  ! VP                  4      4      w  rxV^ 8”  g   Q h\!        V4      ^ 8”  g   Q hR#   \"         d%   p	\$        P&                  ! RT	 24        Rp	?	R# Rp	?	ii ; i))Úwrapsr   ÚmodelÚtest_tts_modelÚinputzHello worldÚvoiceÚalloyú/v1/audio/speech©r#   úcontent-typeú	audio/mp3zcontent-dispositionzattachment; filename=speech.mp3z(Failed to read or validate MP3 content: N)r   rk   Úgenerater   r3   r"   ÚheadersÚlowerÚassert_any_callÚassert_called_onceÚ	call_argsr!   Ú
audio_readÚioÚBytesIOÚcontentr+   Ú	ExceptionÚpytestÚfail)
r   r   Úmock_tts_modelÚpayloadr%   Úargsrg   rJ   rH   Úes
   &&        r   Útest_tts_speechrˆ   n   sƒ  € ä“[€NÜ'Ô.NÔO€NÔä%.¸NÔ%KÐÔ"àÐ(¨'°=À'È7ÐS€GØ�{‰{Ð-°Gˆ{Ó<€HØ×Ñ 3Ô&Ð&Ð&Ø×Ñ˜NÕ+×1Ñ1Ó3°{ÔBÐBÐBà×ÑÐ.Õ/×5Ñ5Ó7Ø,ô	-ðð	-ð ×"Ñ"×2Ñ2Ð3CÔDØ×Ñ×.Ñ.Ô0à!×*Ñ*×4Ñ4�L€DØ��7�g˜gÕ&Ô&Ð&Ð&Ø�:‰:�gÓ '¨'Õ"2Ô2Ð2Ð2ðDÜ",¬R¯ZªZ¸×8HÑ8HÓ-IÓ"JÑˆ
Ø˜QŒÐˆÜ�:‹ Ô"Ð"Ò"øÜô DÜ�ŠÐ>¸q¸cÐB×CÒCûðDús   Ä3AE; Å;F*ÆF%Æ%F*c                ó0   € V ^8„  d   QhR\         R\        /# )rV   Ú
model_nameÚreturn)rY   r   )rZ   s   "r   r[   r[   �   s   € ÷ ñ ¤3ð Ô+Bñ r   c                ó€   € \         P                  ! RRV  24      p\         P                  ! RVR7      p\        RVR7      # )zJConstruct a RepositoryNotFoundError shaped like the real HF client raises.ÚGETz"https://huggingface.co/api/models/r<   )Úrequestz&404 Client Error. Repository Not Found)r%   )ÚhttpxÚRequestÚResponser   )rŠ   rŽ   r%   s   &  r   Ú_hf_repo_not_foundr’   �   s<   € ä�mŠm˜EÐ%GÈ
À|Ð#TÓU€GÜ�~Š~˜c¨7Ô3€HÜ"Ø
0¸Hôð r   c                ó‚  € R p\        VR7      Vn        RRRRRR/pV P                  R	VR
7      pVP                  R8X  g,   Q RVP                   R\	        VP
                  4       R24       hVP                  R,          P                  R4      '       g   Q hVP                  4       pRV9   g   Q hRVR,          9   g   Q hR# )a[  Regression: bad model ids must surface as 4xx, not 200 OK with empty body.

Before the pre-flight fix, ``StreamingResponse`` committed the response
headers (200 OK) before the worker thread tried to load the model, so any
HuggingFace failure ended up as a clean zero-byte body. The fix loads the
model synchronously before returning the response.
c                 ó   € \        V 4      hr   ©r’   ©rŠ   s   &r   Ú_raiseÚDtest_tts_speech_bad_model_returns_404_not_silent_200.<locals>._raiseŸ   ó   € Ü  Ó,Ð,r   ©Úside_effectrn   údoes-not-exist-on-hfrp   ÚhiÚresponse_formatÚwavrs   rt   r<   ú expected 404 for bad model, got ú (body length=Ú)ru   úapplication/jsonr=   N)	r   r   r3   r"   r+   r€   rx   Ú
startswithr#   ©r   r   r—   r…   r%   Úbodys   &&    r   Ú4test_tts_speech_bad_model_returns_404_not_silent_200r§   –   sÜ   € ò-ô &/¸6Ô%BÐÔ"ð 	Ð'Ø�Ø˜5ð€Gð
 �{‰{Ð-°Gˆ{Ó<€Hà×Ñ 3Ô&ð Ø
*¨8×+?Ñ+?Ð*@ð AÜ˜H×,Ñ,Ó-Ð.¨að	1óÐ&ð ×Ñ˜NÕ+×6Ñ6Ð7I×JÒJÐJÐJØ�=‰=‹?€DØ�tÔÐÐØ! T¨(¥^Ô3Ð3Ò3r   c                ó0  € R p\        VR7      Vn        RRRRRR/pV P                  R	VR
7      pVP                  R8X  g   Q hVP                  R,          P                  R4      '       g   Q hVP                  4       pRV9   g   Q hRVR,          9   g   Q hR# )zCNon-HF load failures should surface as 500 with a JSON detail body.c                 ó   € \        R 4      h)zcheckpoint is corrupted)ÚRuntimeErrorr–   s   &r   r—   Ú8test_tts_speech_load_failure_returns_500.<locals>._raise¸   s   € ÜÐ4Ó5Ð5r   rš   rn   z
some-modelrp   r�   rž   rŸ   rs   rt   iô  ru   r£   r=   N)r   r   r3   r"   rx   r¤   r#   r¥   s   &&    r   Ú(test_tts_speech_load_failure_returns_500r¬   µ   sŸ   € ò6ô &/¸6Ô%BÐÔ"à˜ g¨tÐ5FÈÐN€GØ�{‰{Ð-°Gˆ{Ó<€Hà×Ñ 3Ô&Ð&Ð&Ø×Ñ˜NÕ+×6Ñ6Ð7I×JÒJÐJÐJØ�=‰=‹?€DØ�tÔÐÐØ˜4 �>Ô)Ð)Ò)r   c                ó’  € R p\        VR7      Vn        V P                  RRR\        4       R3/RR/R	7      pVP                  R
8X  g,   Q RVP                   R\        VP                  4       R24       hVP                  R,          P                  R4      '       g   Q hVP                  4       pRV9   g   Q hRVR,          9   g   Q hR# )zHSame silent-200 hazard applies to the default ndjson streaming response.c                 ó   € \        V 4      hr   r•   r–   s   &r   r—   Ú=test_stt_transcriptions_bad_model_returns_404.<locals>._raiseÊ   r™   r   rš   ú/v1/audio/transcriptionsÚfileútest.mp3rv   rn   rœ   ©Úfilesr   r<   r    r¡   r¢   ru   r£   r=   N)
r   r   r3   Ú _make_transcription_audio_bufferr"   r+   r€   rx   r¤   r#   )r   r   r—   r%   r¦   s   &&   r   Ú-test_stt_transcriptions_bad_model_returns_404r¶   Ç   sâ   € ò-ô &/¸6Ô%BÐÔ"à�{‰{Ø"Ø˜
Ô$DÓ$FÈÐTÐUØÐ-Ð.ð ó €Hð ×Ñ 3Ô&ð Ø
*¨8×+?Ñ+?Ð*@ð AÜ˜H×,Ñ,Ó-Ð.¨að	1óÐ&ð ×Ñ˜NÕ+×6Ñ6Ð7I×JÒJÐJÐJØ�=‰=‹?€DØ�tÔÐÐØ! T¨(¥^Ô3Ð3Ò3r   c                 óN  € \        4       p\        R R/R7      Vn        \        VR7      Vn        Rp^pRp\        P                  ! ^ V\        W4,          4      R4      pR\        P                  ! ^\        P                  ,          V,          V,          4      P                  \        P                  4      ,          p\        P                  ! 4       p\        W‡VRR7       VP                  ^ 4       V P                  R	R
RVR3/RR/R7      p	V	P                  ^È8X  g   Q hV	P!                  4       R R/8X  g   Q hVP                  P#                  R4       VP                  P%                  4        VP                  P&                  ^ ,          ^ ,          P)                  R4      '       g   Q hR# )ÚtextzThis is a test transcription.r   r]   r^   Fr_   Úmp3©rZ   r°   r±   r²   rv   rn   Útest_stt_modelr³   z/tmp/N)r   rw   r   r`   ra   rb   rc   rd   re   rf   r~   r   Úaudio_writeÚseekr3   r"   r#   rz   r{   r|   r¤   )
r   r   Úmock_stt_modelrH   rh   ri   rj   rJ   Úbufferr%   s
   &&        r   Útest_stt_transcriptionsrÀ   ß   sb  € ä“[€NÜ'ØÐ=Ð>ô€NÔô &/¸NÔ%KÐÔ"à€KØ€HØ€IÜ
�Š�A�x¤ [Õ%;Ó!<¸eÓD€AØ”r—v’v˜a¤"§%¡%�i¨)Õ3°aÕ7Ó8×?Ñ?ÄÇ
Á
ÓKÕK€Jä�ZŠZ‹\€FÜ� K¸Õ>Ø
‡K�K�„Nà�{‰{Ø"Ø˜
 F¨KÐ8Ð9ØÐ'Ð(ð ó €Hð ×Ñ 3Ô&Ð&Ð&Ø�=‰=‹?˜vÐ'FÐGÔGÐGÐGà×"Ñ"×2Ñ2Ð3CÔDØ×Ñ×.Ñ.Ô0à×"Ñ"×,Ñ,¨QÕ/°Õ2×=Ñ=¸g×FÒFÐFÒFr   c                 ó„  € Rp ^pRp\         P                  ! ^ V\        W,          4      R4      pR\         P                  ! ^\         P                  ,          V,          V,          4      P                  \         P                  4      ,          p\        P                  ! 4       p\        WTV RR7       VP                  ^ 4       V# )z>Build a tiny mp3 buffer suitable as the ``file`` upload field.r]   r^   Fr_   r¹   rº   )r`   ra   rb   rc   rd   re   rf   r~   r   r¼   r½   )rH   rh   ri   rj   rJ   r¿   s         r   rµ   rµ     sˆ   € à€KØ€HØ€IÜ
�Š�A�x¤ [Õ%;Ó!<¸eÓD€AØ”r—v’v˜a¤"§%¡%�i¨)Õ3°aÕ7Ó8×?Ñ?ÄÇ
Á
ÓKÕK€JÜ�ZŠZ‹\€FÜ� K¸Õ>Ø
‡K�K�„NØ€Mr   c                ó¤   € \        4       p\        VR 7      Vn        \        VR 7      Vn        V P                  RRR\	        4       R3/RRRV/R7      # )	r   r°   r±   r²   rv   rn   r»   rž   r³   )r   rw   r   r3   rµ   )r   r   Úmock_returnrž   r¾   s   &&&$ r   Ú_post_transcriptionrÄ     s^   € Ü“[€NÜ'°[ÔA€NÔÜ%.¸NÔ%KÐÔ"à�;‰;Ø"Ø˜
Ô$DÓ$FÈÐTÐUØÐ'Ð):¸OÐLð ó ð r   c                óÈ   € \        V VRR/RR7      pVP                  ^È8X  g   Q hVP                  R,          P                  R4      '       g   Q hVP                  R8X  g   Q hR# )zAresponse_format=text returns plain text body with the transcript.r¸   úHello world.©rž   ru   z
text/plainN)rÄ   r"   rx   r¤   r¸   r$   s   && r   Ú,test_stt_transcriptions_response_format_textrÈ     sg   € ä"ØØØ	�Ð Øô	€Hð ×Ñ 3Ô&Ð&Ð&Ø×Ñ˜NÕ+×6Ñ6°|×DÒDÐDÐDØ�=‰=˜NÔ*Ð*Ò*r   c                óÔ   € \        V VRR/RR7      pVP                  ^È8X  g   Q hVP                  R,          P                  R4      '       g   Q hVP	                  4       RR/8X  g   Q hR# )zDresponse_format=json returns the OpenAI minimal {"text": ...} shape.r¸   rÆ   r#   rÇ   ru   r£   N©rÄ   r"   rx   r¤   r#   r$   s   && r   Ú,test_stt_transcriptions_response_format_jsonrË   ,  so   € ä"ØØØ	�Ð Øô	€Hð ×Ñ 3Ô&Ð&Ð&Ø×Ñ˜NÕ+×6Ñ6Ð7I×JÒJÐJÐJØ�=‰=‹?˜v ~Ð6Ô6Ð6Ò6r   c                óŒ  € RRRRRR^ RRRR	R
R/R^RRRRR
R/./p\        V VVRR7      pVP                  ^È8X  g   Q hVP                  R,          P                  R4      '       g   Q hVP	                  4       pVR,          R8X  g   Q hVR,          R8X  g   Q hVR,           Uu. uF  qUR,          NK  	  upRR.8X  g   Q hR# u upi )zMresponse_format=verbose_json passes the full model payload through unchanged.r¸   rÆ   ÚlanguageÚenÚsegmentsr*   ÚHelloÚstartç        Úendr_   z world.ç      ð?Úverbose_jsonrÇ   ru   r£   NrÊ   )r   r   Úfull_payloadr%   r¦   Úss   &&    r   Ú4test_stt_transcriptions_response_format_verbose_jsonrØ   9  sö   € ð 	�Ø�DØØ�1�f˜g w°°U¸CÐ@Ø�1�f˜i¨°#°u¸cÐBð
ð€Lô #ØØØØ&ô	€Hð ×Ñ 3Ô&Ð&Ð&Ø×Ñ˜NÕ+×6Ñ6Ð7I×JÒJÐJÐJØ�=‰=‹?€DØ��<˜>Ô)Ð)Ð)Ø�
Õ˜tÔ#Ð#Ð#Ø# JÖ/Ó0Ñ/˜!ˆf�IˆIÑ/Ñ0°W¸iÐ4HÔHÐHÒHùÒ0s   Â"Cc                ó  € \        4       p\        RR/R7      Vn        \        VR7      Vn        V P                  RRR\	        4       R3/RR	/R
7      pVP
                  ^È8X  g   Q hVP                  R,          P                  R4      '       g   Q hVP                  P                  4        Uu. uF  qDP                  4       '       g   K  VNK  	  ppV'       g   Q R4       h^ RIpV F  pVP                  V4       K  	  R# u upi )zMWithout response_format, the legacy application/x-ndjson stream is preserved.r¸   r�   r   r°   r±   r²   rv   rn   r»   r³   ru   zapplication/x-ndjsonz!expected at least one ndjson lineN)r   rw   r   r3   rµ   r"   rx   r¤   r¸   Ú
splitlinesÚstripr#   Úloads)r   r   r¾   r%   ÚlineÚlinesÚ_jsons   &&     r   Ú7test_stt_transcriptions_default_format_preserves_ndjsonrà   Q  sí   € ô “[€NÜ'°f¸d°^ÔD€NÔÜ%.¸NÔ%KÐÔ"à�{‰{Ø"Ø˜
Ô$DÓ$FÈÐTÐUØÐ'Ð(ð ó €Hð
 ×Ñ 3Ô&Ð&Ð&Ø×Ñ˜NÕ+×6Ñ6Ð7M×NÒNÐNÐNà&Ÿm™m×6Ñ6Ô8ÓIÑ8�d¿J¹J¿L�TˆTÑ8€EÐIßÐ5Ð5Ó5ˆ5ÛãˆØ�‰�DÖó ùò	 Js   Â+C>ÃC>c                ó  € \         P                  ! ^ V \        W,          4      RR7      p\         P                  ! ^\         P                  ,          R,          V,          4      R,          P                  \         P                  4      pV# )z?Create int16 audio that reliably triggers VAD speech detection.F)Úendpointi,  i¨a  )r`   ra   rb   rc   rd   re   Úint16)Ú
duration_srH   rj   rG   s   &&  r   Úmake_speech_audiorå   n  sV   € ä
�Š�A�z¤3 {Õ'?Ó#@È5ÔQ€Aä�VŠV�AœŸ™•I •O aÕ'Ó(¨5Õ0×8Ñ8¼¿¹ÓB€EØ€Lr   c                ól   € \         P                  ! \        W,          4      \         P                  R7      # )zFCreate int16 audio of near-zero values that VAD classifies as silence.©Údtype)r`   Úzerosrb   rã   )rä   rH   s   &&r   Úmake_silence_audiorê   v  s   € ä�8Š8”C˜Õ0Ó1¼¿¹ÔBÐBr   c                ó$   a € RRRRRR/V 3R llpV# )zNBuild a mock generate function with a ``stream`` parameter that yields deltas.ÚstreamFrÍ   NÚverbosec                ór   <€ V'       d   \        S4      # \        R P                  R S 4       4      RRR7      # )Ú c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   rX   )Ú.0Úds   & r   Ú	<genexpr>Ú=_make_streaming_generate.<locals>.generate.<locals>.<genexpr>ƒ  s   é € Ð0© Aœ˜QŸ˜«ùs   ‚N©r¸   rÏ   rÍ   )Úiterr   Újoin)rG   rì   rÍ   rí   rg   Údeltass   &$$$,€r   rw   Ú*_make_streaming_generate.<locals>.generate~  s3   ø€ ßÜ˜“<ÐäØ—‘Ñ0©Ó0Ó0¸4È$ô
ð 	
r   r   )rø   rw   s   f r   Ú_make_streaming_generaterú   {  s$   ø€ ð
 %ð 
°$ð 
À÷ 
ð €Or   c                ó    a € RRRR/V 3R llpV# )zEBuild a mock generate without a ``stream`` parameter (legacy models).rÍ   Nrí   Fc                ó    <€ \        SR R R7      # )Nrõ   )r   )rG   rÍ   rí   rg   r¸   s   &$$,€r   rw   Ú._make_non_streaming_generate.<locals>.generateŒ  s   ø€ Ü˜d¨T¸DÔAÐAr   r   )r¸   rw   s   f r   Ú_make_non_streaming_generaterþ   ‰  s    ø€ ðB Dð B°%÷ Bð €Or   c                   ó*   a € ] tR tRt o RtR tRtV tR# )Ú	MockChunki’  z3Structured streaming result with a .text attribute.c                ó   € Wn         R # r   ©r¸   )rI   r¸   s   &&r   rK   ÚMockChunk.__init__•  s   € ØŽ	r   r  N)rM   rN   rO   rP   Ú__doc__rK   rQ   rR   rS   s   @r   r   r   ’  s   ø‡ € Ù=÷ð r   r   c                ó\   a a€ . o\         P                  ! S 4      VV 3R l4       pSVn        V# )zHWrap fn to track calls while preserving signature for inspect.signature.c                  ó8   <€ SP                  W34       S! V / VB # r   )Úappend)r†   rg   ÚcallsÚfns   *,€€r   ÚwrapperÚ_trackable.<locals>.wrapper�  s!   ø€ à�‰�d�^Ô$Ù�4Ð"˜6Ñ"Ð"r   )Ú	functoolsrm   Úcall_args_list)r	  r
  r  s   f @r   Ú
_trackabler  ™  s2   ù€ à€Eä‡_‚_�RÓõ#ó ð#ð #€GÔØ€Nr   c           	     óœ  € \        4       p\        V4      Vn        \        VR7      Vn        . pRRRR/pV'       d   VP	                  V4       V P                  R4      ;_uu_ 4       pVP                  V4       VP                  4       R,          R8X  g   Q h\        R	4      pR
p	\        ^ \        V4      V	4       F*  p
VP                  WŠW©,            P                  4       4       K,  	  VP                  RR/4         VP                  VP                  4       4       K#    \         d     Mi ; iRRR4       YT3#   + '       g   i     YT3# ; i)zCConnect WS, send config + 6s speech, stop, and return all messages.r   rn   ú
test-modelrH   r]   z!/v1/audio/transcriptions/realtimer/   Úreadyg      @iÀ  ÚactionÚstopN)r   r  rw   r   ÚupdateÚwebsocket_connectÚ	send_jsonÚreceive_jsonrå   Úranger+   Ú
send_bytesÚtobytesr  r�   )r   r   Úgenerate_fnÚconfig_extrar¾   ÚmessagesÚconfigÚwsÚspeechÚ
chunk_sizeÚis   &&&&       r   Ú_ws_send_audio_and_collectr#  ¦  s,  € ô “[€NÜ(¨Ó5€NÔÜ%.¸NÔ%KÐÔ"à€HØ�| ]°EÐ:€FßØ�‰�lÔ#Ø	×	!Ñ	!Ð"E×	FÔ	FÈ"Ø
�‰�VÔØ�‰Ó  Õ*¨gÔ5Ð5Ð5ô # 3Ó'ˆØˆ
Ü�qœ#˜f›+ zÖ2ˆAØ�M‰M˜& Q¥^Ð4×<Ñ<Ó>Ö?ñ 3ð 	�‰�h Ð'Ô(àðØ—‘ §¡Ó 1Ö2øÜô Ùðú÷ 
Gð$ Ð#Ð#÷% 
GÖ	Fð$ Ð#Ð#ús1   Á&BD9Ã<DÄD9ÄD+Ä(D9Ä*D+Ä+D9Ä9E	c                ó   € \        . RO4      p\        WV4      w  r4V Uu. uF  qUP                  R4      R8X  g   K  VNK  	  ppV Uu. uF  qUP                  R4      R8X  g   K  VNK  	  pp\        V4      ^8¼  g   Q RV 24       h\        V4      ^8¼  g   Q RV 24       hV F  pRV9   g   Q hRV9  d   K  Q h	  VR,          p	RV	9   g   Q hRV	R,          9   d   RV	R,          9   g   Q hR	V	9   g   Q hR
# u upi u upi )uC   Streaming model yields string deltas â†’ delta + complete messages.rÐ   ÚtypeÚdeltaÚcompleteúExpected delta messages, got: ú Expected complete message, got: r¸   ÚworldÚ
is_partialN©rÐ   ú worldÚ!éÿÿÿÿ©rú   r#  r!   r+   )
r   r   Úgen_fnr  Ú_Úmrø   Ú	completesrò   r'  s
   &&        r   Ú-test_realtime_ws_streaming_model_sends_deltasr5  Ç  s  € ä%Ò&>Ó?€FÜ,¨VÈ&ÓQ�K€Hñ "Ó>™�A§U¡U¨6£]°gÑ%=�aˆa™€FÐ>Ù$ÓD™H�q¯©¨f«¸Ñ(C—�™H€IÐDäˆv‹;˜!ÔÐHÐ=¸h¸ZÐHÓHÐÜˆy‹>˜QÔÐMÐ"BÀ8À*Ð MÓMÐó ˆØ˜!Œ|Ðˆ|Ø˜QŽÐˆñ ð
 ˜�}€HØ�XÔÐÐØ�h˜vÕ&Ô&¨7°h¸vÕ6FÔ+FÐFÐFØ˜8Ô#Ð#Ò#ùò ?ùÚDs    C6¼C6ÁC;Á$C;c                ó|  € \        R4      p\        WV4      w  r4V Uu. uF  pRV9   g   K  RV9  g   K  VNK  	  pp\        V4      ^8¼  g   Q RV 24       hV Uu. uF  qUP                  RR4      '       d   K  VNK   	  pp\        V4      ^8¼  g   Q RV 24       hVR	,          R,          R8X  g   Q hR# u upi u upi )
u?   Non-streaming model â†’ legacy format messages (no type field).zTranscribed textr¸   r%  ú#Expected legacy text message, got: r+  Tz)Expected final non-partial message, got: Nr/  )rþ   r#  r+   r!   )r   r   r1  r  r2  r3  Ú	text_msgsÚfinals   &&      r   Ú-test_realtime_ws_non_streaming_model_fallbackr:  ß  sÂ   € ä)Ð*<Ó=€FÜ,¨VÈ&ÓQ�K€Hñ %ÓH™H�q¨°!©”¸Àa¹—�™H€IÐHÜˆy‹>˜QÔÐPÐ"EÀhÀZÐ PÓPÐá!ÓC™	�1¯©¨|¸T×)B�QˆQ™	€EÐCÜˆu‹:˜Œ?ÐRÐGÈÀzÐRÓRˆ?Ø��9�VÕÐ 2Ô2Ð2Ò2ùò Iùò Ds   ž	B4¬B4µB4ÁB9Á9B9c                óì  € \        R4      \        R4      .p\        V4      p\        WV4      w  rEV Uu. uF  qfP                  R4      R8X  g   K  VNK  	  ppV Uu. uF  qfP                  R4      R8X  g   K  VNK  	  pp\	        V4      ^8¼  g   Q RV 24       h\	        V4      ^8¼  g   Q RV 24       hV U	u. uF  q™R,          NK  	  p
p	RP                  V
4      pRV9   g   Q hR	# u upi u upi u up	i )
uG   Streaming model yields objects with .text attribute â†’ delta messages.rÐ   r-  r%  r&  r'  r(  r)  rï   N)r   rú   r#  r!   r+   r÷   )r   r   Úchunksr1  r  r2  r3  rø   r4  rò   Údelta_textsÚcombineds   &&          r   Ú,test_realtime_ws_streaming_structured_chunksr?  í  sõ   € ä˜Ó ¤)¨HÓ"5Ð6€FÜ% fÓ-€FÜ,¨VÈ&ÓQ�K€Há!Ó>™�A§U¡U¨6£]°gÑ%=�aˆa™€FÐ>Ù$ÓD™H�q¯©¨f«¸Ñ(C—�™H€IÐDäˆv‹;˜!ÔÐHÐ=¸h¸ZÐHÓHÐÜˆy‹>˜QÔÐMÐ"BÀ8À*Ð MÓMÐñ (.Ó.¡v !�W—:�:¡v€KÐ.Ø�w‰w�{Ó#€HØ�hÔÐÒùò ?ùÚDùò /s   ´C'ÁC'ÁC,Á8C,Â8C1c                ó<  € \        R.4      p\        WV4      w  r4VP                  p\        VP                  4      ^ 8”  g   Q R4       hVP                  ^ ,          ^ ,          ^ ,          p\        V\        P                  4      '       g   Q R\        V4       24       hR# )z2Streaming models receive mx.array, not file paths.Útestzgenerate was never calledzExpected mx.array, got N)	rú   r#  rw   r+   r  Ú
isinstanceÚmxÚarrayr%  )r   r   r1  r2  r¾   ÚtrackedÚ	first_args   &&     r   Útest_realtime_ws_mx_array_passrG  ÿ  s’   € ä% v hÓ/€FÜ2°6ÐPVÓWÑ€Að ×%Ñ%€GÜˆw×%Ñ%Ó&¨Ô*ÐGÐ,GÓGÐ*Ø×&Ñ& qÕ)¨!Õ,Ø	õ€Iô �i¤§¡×*Ò*ÐWÐ.EÄdÈ9ÃoÐEVÐ,WÓWÒ*r   c                óä   € RRRRRR/R lp\        WV4      w  r4V Uu. uF  qUP                  R4      R8X  g   K  VNK  	  pp\        V4      ^8¼  g   Q hV^ ,          R	,          R
8X  g   Q hR# u upi )zMRegression: models like Parakeet that cast to bfloat16 must receive mx.array.rì   FrÍ   Nrí   c                ó„   € V'       d,   V P                  \        P                  4      p\        R .4      # \	        R RRR7      # )ÚokNrõ   )re   rC  Úbfloat16rö   r   )rG   rì   rÍ   rí   rg   r2  s   &$$$, r   r1  Ú@test_realtime_ws_mx_array_supports_bfloat16_cast.<locals>.gen_fn  s2   € ßà—‘œRŸ[™[Ó)ˆAÜ˜˜“<ÐÜ˜d¨T¸DÔAÐAr   r%  r'  r¸   rJ  )r#  r!   r+   )r   r   r1  r  r2  r3  r4  s   &&     r   Ú0test_realtime_ws_mx_array_supports_bfloat16_castrM    s‚   € ðB ð B°ð B¸eô Bô -¨VÈ&ÓQ�K€HÙ$ÓD™H�q¯©¨f«¸Ñ(C—�™H€IÐDÜˆy‹>˜QÔÐÐØ�Q�<˜Õ 4Ô'Ð'Ò'ùò Es
   žA-ºA-c                óä  € \        . RO4      p\        WVRR/R7      w  r4V Uu. uF  qUP                  R4      R8X  g   K  VNK  	  ppV Uu. uF  qUP                  R4      R8X  g   K  VNK  	  pp\        V4      ^ 8X  g   Q RV 24       h\        V4      ^ 8X  g   Q RV 24       hV Uu. uF  pR	V9   g   K  RV9  g   K  VNK  	  pp\        V4      ^8¼  g   Q R
V 24       hR# u upi u upi u upi )zPStreaming-capable model with streaming=false config falls back to legacy format.Ú	streamingF)r  r%  r&  r'  z9Expected no delta messages when streaming disabled, got: z<Expected no complete messages when streaming disabled, got: r¸   r7  Nr,  r0  )	r   r   r1  r  r2  r3  rø   r4  r8  s	   &&       r   Ú,test_realtime_ws_streaming_disabled_fallbackrP    s  € ä%Ò&>Ó?€FÜ,Ø V¸;ÈÐ:Nô�K€Hñ
 "Ó>™�A§U¡U¨6£]°gÑ%=�aˆa™€FÐ>Ù$ÓD™H�q¯©¨f«¸Ñ(C—�™H€IÐDäˆF‹�qÔðLà	BÀ6À(ÐKóLØô 	ˆI‹˜!ÔðRà	EÀiÀ[ÐQóRØñ %ÓH™H�q¨°!©”¸Àa¹—�™H€IÐHÜˆy‹>˜QÔÐPÐ"EÀhÀZÐ PÓPÒùò ?ùÚDùò Is)   ¤C#Á C#ÁC(Á(C(Â(	C-Â6C-Â?C-c                   óT   a € ] tR tRt o RtRtR tR tR tRR lt	]
R 4       tR	tV tR
# )Ú_FakeStreamingSessioni6  zDMinimal streaming session: emits one delta once the audio is closed.r]   c                ó"   € R V n         R V n        R# )FN©Ú_closedÚ_emitted©rI   s   &r   rK   Ú_FakeStreamingSession.__init__;  s   € ØˆŒØˆŽr   c                ó   € R # r   r   )rI   Úsampless   &&r   ÚfeedÚ_FakeStreamingSession.feed?  s   € Ùr   c                ó   € R V n         R# )TN)rU  rW  s   &r   ÚcloseÚ_FakeStreamingSession.closeB  s	   € ØˆŽr   c                ób   € V P                   '       d   V P                  '       g   R V n        R.# . # )TÚbonjourrT  )rI   Úmax_decode_tokenss   &&r   ÚstepÚ_FakeStreamingSession.stepE  s'   € Ø�<�<ˆ< §§ Ø ˆDŒMØ�;ÐØˆ	r   c                óB   € V P                   ;'       d    V P                  # r   rT  rW  s   &r   ÚdoneÚ_FakeStreamingSession.doneK  s   € à�|‰|×-Ð- §¡Ð-r   rT  N)é   )rM   rN   rO   rP   r  Úinput_sample_raterK   r[  r^  rc  Úpropertyrf  rQ   rR   rS   s   @r   rR  rR  6  s6   ø‡ € ÙNàÐòòòôð ñ.ó ö.r   rR  c                   ó.   a € ] tR tRt o RR/R ltRtV tR# )Ú_FakeStreamingModeliP  ÚtemperaturerÒ   c               ó   € \        4       # r   )rR  )rI   rm  rg   s   &$,r   Úcreate_streaming_sessionÚ,_FakeStreamingModel.create_streaming_sessionQ  s   € Ü$Ó&Ð&r   r   N)rM   rN   rO   rP   ro  rQ   rR   rS   s   @r   rl  rl  P  s   ø‡ € ð'°c÷ 'ò 'r   rl  c                   ó>   a € ] tR tRt o RtR tRR ltRR ltRtV t	R# )	Ú_FakeVadModeliU  zDReturns a scripted speech probability per consumed 512-sample frame.c                ó   € Wn         R # r   ©Ú_probs)rI   Úprobss   &&r   rK   Ú_FakeVadModel.__init__X  s   € ØŽr   c                ó
   € R ^ /# )r"  r   )rI   rH   s   &&r   Úinitial_stateÚ_FakeVadModel.initial_state[  s   € Ø�Qˆxˆr   c                ó¸   € VR ,          pV\        V P                  4      8  d   V P                  V,          MRp\        P                  ! V..4      R V^,           /3# )r"  rÒ   )r+   ru  rC  rD  )rI   ÚchunkÚstaterH   r"  Úps   &&&&  r   r[  Ú_FakeVadModel.feed^  sI   € Ø�#�JˆØ¤# d§k¡kÓ"2Ô2ˆD�K‰K˜ŽN¸ˆÜ�xŠx˜!˜˜‹  a¨!¥e Ð,Ð,r   rt  N©r]   )
rM   rN   rO   rP   r  rK   ry  r[  rQ   rR   rS   s   @r   rr  rr  U  s   ø‡ € ÙNòô÷-ò -r   rr  c                ób  a€ ^ RI p^ RIHp \        \	        4       R7      Vn        R.^,          R.^<,          ,           oVP                  RV3R l4       V P                  R4      ;_uu_ 4       pVP                  4       R	,          R
8X  g   Q hVP                  R	RRRRRR	RRR/RR	RR^ /////4       VP                  4       pVR	,          R8X  g   Q hVR,          R,          R,          R,          R	,          R8X  g   Q h\        P                  ! V^(,          \        P                  R7      P                  4       pVP                  R	RRVP                  V4      P                  4       /4       . p VP                  4       p	VP!                  V	4       V	R	,          R8X  g   K2   RRR4       X U
u. uF  qªR	,          NK  	  pp
RT9   g   Q hRT9   g   Q hRT9   g   Q hTP#                  R4      TP#                  R4      8  g   Q hTR,          R,          R8X  g   Q hR#   + '       g   i     L‚; iu up
i ) u­   With server_vad the server detects end-of-speech, emits
speech_started/stopped, auto-commits and returns the transcript â€” the
client never sends input_audio_buffer.commit.N)ÚVAD_FRAME_SIZEr   gÍÌÌÌÌÌì?rÒ   z)mlx_audio.server._load_realtime_vad_modelc                 ó   <€ \        S4      # r   )rr  )Únamerv  s   &€r   Ú<lambda>Ú:test_realtime_ws_server_vad_auto_commits.<locals>.<lambda>q  s
   ø€ ”] 5Ô)r   ú/v1/realtime?model=fake-sttr%  úsession.createdúsession.updateÚsessionrG   rp   rZ   z	audio/pcmÚrater]   Úturn_detectionÚ
server_vadÚsilence_duration_mszsession.updatedrç   zinput_audio_buffer.appendz5conversation.item.input_audio_transcription.completedz!input_audio_buffer.speech_startedz!input_audio_buffer.speech_stoppedzinput_audio_buffer.committedÚ
transcriptra  r/  )Úbase64Úmlx_audio.realtime_vadr‚  r   rl  r   Úsetattrr  r  r  r`   ré   rã   r  Ú	b64encodeÚdecoder  Úindex)r   r   Úmonkeypatchr�  r‚  r  ÚupdatedÚpcmÚeventsÚevtr‡   Útypesrv  s   &&&         @r   Ú(test_realtime_ws_server_vad_auto_commitsrœ  d  s<  ø€ ó å5ä%.Ô<OÓ<QÔ%RÐÔ"àˆE�A�I˜˜ �
Õ"€EØ×ÑØ3Ü)ôð
 
×	!Ñ	!Ð"?×	@Ô	@ÀBØ�‰Ó  Õ(Ð,=Ô=Ð=Ð=à
�‰àÐ(ØØØØ$ v¨{¸FÀEÐ&JØ,Ø &¨Ø 5°sð/ð"ðð
ðô	
ð  —/‘/Ó#ˆØ�v�Ð"3Ô3Ð3Ð3à�IÕ˜wÕ'¨Õ0Ð1AÕBÀ6ÕJØôð	
ðô �hŠh�~¨Õ*´"·(±(Ô;×CÑCÓEˆØ
�‰àÐ3Ø˜×)Ñ)¨#Ó.×5Ñ5Ó7ðô	
ð ˆØØ—/‘/Ó#ˆCØ�M‰M˜#ÔØ�6�{ÐVÖWØ÷O 
AñR !'Ó'¡˜1ˆv�YˆY¡€EÐ'Ø.°%Ô7Ð7Ð7Ø.°%Ô7Ð7Ð7Ø)¨UÔ2Ð2Ð2à�;‰;Ð:Ó;¸e¿k¹kØ+ó?ô ð ð ð �"�:�lÕ# yÔ0Ð0Ò0÷c 
A×	@üòR (s   Á-D,HÆHÆ+H,ÈH)	c                óŠ  € \        \        4       R7      Vn        V P                  R4      ;_uu_ 4       pVP	                  4       R,          R8X  g   Q hVP                  RRRRRR	RR
/////4       VP	                  4       pVR,          R8X  g   Q hR
VR,          R,          9   g   Q h RRR4       R#   + '       g   i     R# ; i)us   semantic_vad is not implemented yet â†’ the server replies with an error
rather than silently ignoring the request.r   r‡  r%  rˆ  r‰  rŠ  rG   rp   rŒ  Úsemantic_vadÚerrorr1   N)r   rl  r   r  r  r  )r   r   r  rš  s   &&  r   Ú%test_realtime_ws_rejects_semantic_vadr   ¨  sÀ   € ô &/Ô<OÓ<QÔ%RÐÔ"à	×	!Ñ	!Ð"?×	@Ô	@ÀBØ�‰Ó  Õ(Ð,=Ô=Ð=Ð=Ø
�‰àÐ(ØØ˜gÐ(8¸6À>Ð:RÐ'SÐTððô	
ð �o‰oÓˆØ�6�{˜gÔ%Ð%Ð%Ø  W¥¨iÕ!8Ô8Ð8Ñ8÷ 
A×	@×	@Ò	@ús   ³A3B1Â1C	c                 óh   € ^ RI Hp  V ! RR7      pVP                  RJ g   Q hVP                  e   Q hR# )zRTranscriptionRequest defaults word_timestamps=False, timestamp_granularities=None.©ÚTranscriptionRequestr  )rn   FN©Úmlx_audio.serverr£  Úword_timestampsÚtimestamp_granularities©r£  Úreqs     r   Ú3test_transcription_request_word_timestamps_defaultsrª  Á  s5   € å5á
 \Ô
2€CØ×Ñ %Ó'Ð'Ð'Ø×&Ñ&Ò.Ð.Ò.r   c                 ór   € ^ RI Hp  V ! RRRR7      pVP                  RJ g   Q hVP                  R8X  g   Q hR# )z2TranscriptionRequest accepts word_timestamps=True.r¢  r  TÚword)rn   r¦  r§  Nr¤  r¨  s     r   Ú3test_transcription_request_word_timestamps_acceptedr­  Ê  s@   € å5á
Ø¨DÈ&ô€Cð ×Ñ $Ó&Ð&Ð&Ø×&Ñ&¨&Ô0Ð0Ò0r   c           
     óü   a€ / oV3R lp\        4       pW#n        \        VR7      Vn        V P                  RRR\	        4       R3/RRR	R
RR/R7      pVP
                  ^È8X  g   Q hSP                  R4      RJ g   Q hR# )zãword_timestamps=true form field reaches stt_model.generate() as a kwarg.

The STTExecutionAdapter allowlist (_STT_EXTRA_KWARGS) must pass word_timestamps
through even when it isn't declared in the model's generate() signature.
c                 ó6   <€ SP                  V4       R RR. RR/# )r¸   ÚhellorÏ   rÍ   rÎ   )r  )Úpathrg   Úcaptured_kwargss   &,€r   Úmock_generateÚBtest_stt_word_timestamps_passed_to_generate.<locals>.mock_generateÝ  s$   ø€ Ø×Ñ˜vÔ&Ø˜ ¨R°¸TÐBÐBr   r   r°   r±   r²   rv   rn   r»   rž   rÕ   r¦  Útruer³   TN)r   rw   r   r3   rµ   r"   r!   )r   r   r³  r¾   r%   r²  s   &&   @r   Ú+test_stt_word_timestamps_passed_to_generater¶  Õ  s›   ø€ ð €OõCô “[€NØ+ÔÜ%.¸NÔ%KÐÔ"à�{‰{Ø"Ø˜
Ô$DÓ$FÈÐTÐUàÐ%Ø˜~Ø˜vð
ð ó €Hð ×Ñ 3Ô&Ð&Ð&Ø×ÑÐ0Ó1°TÓ9Ð9Ò9r   c                óV  € 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/././p\        4       p\        VR7      Vn        \        VR7      Vn        V P                  RRR\	        4       R3/RRRRRR/R7      pVP
                  ^È8X  g   Q hVP                  4       pVR,          R8X  g   Q hVP                  R. 4      p\        V4      ^8X  g   Q hV^ ,          P                  R. 4      p\        V4      ^8X  g   Q hV^ ,          R,          R8X  g   Q hV^,          R,          R8X  g   Q hR# ) zPverbose_json response includes words[] from the model when word_timestamps=True.r¸   rÆ   rÍ   rÎ   rÏ   r*   rÑ   rÒ   rÓ   rÔ   Úwordsr¬  rÐ   r_   Úprobabilityg®Gáz®ï?zworld.g\�Âõ(\ï?r   r°   r±   r²   rv   rn   r»   rž   rÕ   r¦  rµ  r³   N)	r   rw   r   r3   rµ   r"   r#   r!   r+   )r   r   rÖ   r¾   r%   r¦   rÏ   r¸  s   &&      r   Ú7test_stt_word_timestamps_verbose_json_words_passthroughrº  ó  sp  € ð
 	�Ø�DØà�aØ˜Ø˜Ø�sØØ˜W g¨s°E¸3ÀÈtÐTØ˜X w°°U¸CÀÐPTÐUðð	ð
ð€Lô" “[€NÜ'°\ÔB€NÔÜ%.¸NÔ%KÐÔ"à�{‰{Ø"Ø˜
Ô$DÓ$FÈÐTÐUàÐ%Ø˜~Ø˜vð
ð ó €Hð ×Ñ 3Ô&Ð&Ð&Ø�=‰=‹?€DØ��<˜>Ô)Ð)Ð)Ø�x‰x˜
 BÓ'€HÜˆx‹=˜AÔÐÐØ�Q�K�O‰O˜G RÓ(€EÜˆu‹:˜Œ?Ðˆ?Ø��8�FÕ˜wÔ&Ð&Ð&Ø��8�FÕ˜xÔ'Ð'Ò'r   r€  r   )Fr  r~   Úunittest.mockr   r   r   r�   Úmlx.coreÚcorerC  Únumpyr`   r‚   Úhuggingface_hub.errorsr   Úmlx_audio.audio_ior   r}   r   r¼   ÚimportorskipÚfastapi.testclientr   r¥  r   Úfixturer   r   r&   r,   r5   r:   r?   rB   rD   rk   rˆ   r’   r§   r¬   r¶   rÀ   rµ   rÄ   rÈ   rË   rØ   rà   rå   rê   rú   rþ   r   r  r#  r5  r:  r?  rG  rM  rP  rR  rl  rr  rœ  r   rª  r­  r¶  rº  r   r   r   Ú<module>rÄ     sn  ðÛ Û 	ß 5Ñ 5ã Ý Û Û Ý :å 1Ý 3ð × Ò �KÐ(WÕ Xå )å  ð ‡�ñó ðð ‡‚˜Ôñó ðò=ò-òIòKòSòR÷'ñ 'õFòDõ>ò4ò>*ò$4ò0GòN
ò	ò
+ò
7òIò0ô:ôCò
ò÷ñ ò
ô$òB$ò03òò$Xò(ò Q÷2.ñ .÷4'ñ '÷
-ñ -òA1òH9ò2/ò1ò:ô<+(r   