+
    UV-jV ã                   óö  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHtHtHtHtHtHt ^ RIHt ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RIH t H!t! ^ RI"H#t#H$t$ ^ R	I%H&t& ^ R
I'H(t( ^RI)H*t* ^RI+H,t, ^RI-H.t. RR0t// RRbRRbRRbRRbRRbRRbRRbRRbRR bR!R"bR#R$bR$R$bR%R&bR'R(bR)R*bR+R,bt0^t1. RƒOt2R-R./t3R„t4R/ R0 lt5R1 R2 lt6R3 R4 lt7]7! 4       t8R5 R6 lt9R7 R8 lt:R9 R: lt;R; R< lt<R= R> lt=R? R@ lt>RA RB lt?R…RD lt@RE RF ltARG RH ltBRI RJ ltCR†RK RL lltDR‡RM RN lltERO RP ltFRˆRQ ltGRR tHR‰RS RT lltIRŠRU RV lltJRW RX ltKRY RZ ltLR‹R[ R\ lltMR‡R] R^ lltN]13R_ R` lltORˆRa Rb lltPRc Rd ltQRe Rf ltRRgRC/Rh Ri lltSRj Rk ltTRŒRl Rm lltURn tVRo tWRp Rq ltXRŒRr Rs lltYRt Ru ltZR�Rv Rw llt[RŽRx lt\R�Ry lt]R�Rz lt^R‡R{ R| llt_ ! R} R~4      t` ! R R€4      taR� R‚ ltbR# )‘é    N)ÚBytesIO)ÚPath)Údedent)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)Úsnapshot_download)Útree_flattenÚtree_map)ÚImageÚImageOps)ÚAutoProcessor©ÚProcessorMixin)ÚBaseImageProcessor)Úload_tokenizer)Úapply_lora_layersÚnvfp4Úmxfp8Úllava_qwen2Úfastvlmzllava-qwen2Úllava_bunnyzbunny-llamazlfm2-vlÚlfm2_vlÚcohere2_visionÚ
aya_visionÚjvlmÚjina_vlmzphi4-siglipÚphi4_siglipÚ
sam3_videoÚsam3zsam3.1_videoÚsam3_1zgranite-visionÚgranite_visionzgranite4-visionÚgranite4_visionzrf-detrÚrfdetrzfalcon-perceptionÚfalcon_perceptionÚ nemotronh_nano_omni_reasoning_v3Únemotron_h_nano_omniÚ
cohere2moeÚcohere2_moeÚF8_E8M0ÚU8c                ó$   € V ^8„  d   QhR\         /# ©é   Úconfig©Údict)Úformats   "Ú^/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/utils.pyÚ__annotate__r7   B   s   € ÷ ñ ¼4ñ ó    c                 óT   € \          F  pW!9   g   K  \        WW,          4       K  	  V # ©N)ÚGENERATION_CONFIG_DEFAULT_KEYSÚsetattr)Úmodel_configr2   Úkeys   && r6   Ú apply_generation_config_defaultsr?   B   s%   € ß-ˆØŽ=Ü�L v¥{Ö3ñ .ð Ðr8   c                ó4   € V ^8„  d   QhR\         R\         RR/# )r1   r2   Úgeneration_configÚreturnNr3   )r5   s   "r6   r7   r7   I   s!   € ÷ 1ñ 1¤Tð 1¼dð 1Àtñ 1r8   c                 óŒ   € \        V\        4      '       d	   V'       g   R # WR&   \         F  pW!9   g   K  W,          W&   K  	  R # )NrA   )Ú
isinstancer4   r;   )r2   rA   r>   s   && r6   Ú_merge_generation_configrE   I   s9   € ÜÐ'¬×.Ò.×6GÙà"3ÐÑß-ˆØÖ#Ø+Õ0ˆF‹Kó .r8   c                ó8   € V ^8„  d   QhR\         P                  /# ©r1   rB   ©ÚmxÚarray)r5   s   "r6   r7   r7   S   s   € ÷ -ñ -œBŸH™Hñ -r8   c                 ó®  € . p \        R4       FŸ  pV^,	          ^,          pV^,	          ^,          pV^,          pV^ 8X  d   VR,          R,          pM?V^8X  d   V^8X  d   \        R4      pM%RVR,          ,           RV^,
          ,          ,          pT P                  V'       d   V) MT4       K¡  	  \        P                  ! V \        P
                  R7      # )aE  Return a 256-entry ``float32`` LUT mapping every E4M3FN byte to its value.

OCP ``E4M3FN``: 1 sign / 4 exponent (bias 7) / 3 mantissa bits,
no infinities, and ``(exp=15, mant=7)`` reserved for NaN (max finite
magnitude is therefore 448). This matches the byte convention MLX uses for
``nvfp4`` scales (verified empirically).
é   g       @ç       @Únanç      ð?©Údtypeg      �?)ÚrangeÚfloatÚappendrI   rJ   Úfloat32)ÚtableÚbyteÚsignÚexponentÚmantissaÚvalues         r6   Ú_e4m3_decode_tabler\   S   s«   € ð €EÜ�c–
ˆØ˜•	˜Q�ˆØ˜A•I Õ$ˆØ˜#•:ˆØ�qŒ=Ø •^ wÕ.‰EØ˜Œ^ ¨A¤Ü˜%“L‰Eà˜8 c�>Õ)¨S°XÀµ\Õ-BÕBˆEØ�‰Ÿt�e‘V¨Ö/ñ ô �8Š8�E¤§¡Ô,Ð,r8   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r1   ÚxrB   rH   )r5   s   "r6   r7   r7   n   s"   € ÷ *!ñ *!”B—H‘Hð *!¤§¡ñ *!r8   c                ó’  € \         P                  ! V P                  \         P                  4      R4      p V P	                  \         P
                  4      pV^,	          ^ÿ,          pVR,          pVP                  \         P                  4      ^x,
          p^pW5^,
          ,	          ^,          pV^V^,
          ,          ^,
          ,          ^ 8g  pW5,	          pWgP                  \         P
                  4      V^,          ,          ,          p	W‰,           pV^,	          p
V^,          pWJP                  \         P                  4      ,           pV^8„  V^8H  V^8H  ,          ,          p\         P                  ! V\         P                  ! ^\         P                  4      V4      p\         P                  ! V\         P                  ! ^\         P
                  4      V4      pVP                  \         P
                  4      ^,          V,          pV^8¬  pV R,          p\         P                  ! V4      pWï,
          pVP                  \         P
                  4      pVR8„  VR8H  V^,          ^8H  ,          ,          pVVP                  \         P
                  4      ,           p\         P                  ! WÜV4      pVP                  \         P                  4      # )a(  Encode non-negative ``float32`` values to ``E4M3FN`` bytes.

Pure-MLX bit manipulation (MLX exposes no float8 dtype). Saturates to 448
on overflow and flushes to the subnormal grid / zero on underflow. Inputs
are assumed ``>= 0`` (NVFP4 group scales are magnitudes), so the sign bit is
always 0.
g        iÿÿ g      €@g      à?)rI   ÚmaximumÚastyperU   ÚviewÚuint32Úint32ÚwhererJ   ÚfloorÚuint8)r^   ÚbitsÚfexpÚfmanrY   ÚdropÚ	round_bitÚstickyrZ   ÚroundupÚcarryÚoverÚnormal_byteÚnormal_validÚsubÚ	sub_floorÚfracÚsub_floor_u32ÚupÚsub_byterW   s   &                    r6   Ú_f32_to_e4m3ry   n   sû  € ô 	�
Š
�1—8‘8œBŸJ™JÓ'¨Ó-€AØ�6‰6”"—)‘)Ó€DØ�B�J˜$Õ€DØ�(�?€Dð �{‰{œ2Ÿ8™8Ó$ sÕ*€HØ€DØ �(Õ# qÕ(€IØ�q˜T A�X•¨!Õ+Õ,°Ñ2€FØ�|€HØŸ=™=¬¯©Ó3°xÀ!µ|ÕDÕE€GØÕ!€HØ˜�M€EØ˜#�~€HØŸ,™,¤r§x¡xÓ0Õ0€Hð �r‰M˜x¨2™~°(¸a±-Õ@ÕA€DÜ�xŠx˜œbŸhšh r¬2¯8©8Ó4°hÓ?€HÜ�xŠx˜œbŸhšh q¬"¯)©)Ó4°hÓ?€HØ—?‘?¤2§9¡9Ó-°Õ2°hÕ>€KØ˜q‘=€Lð ˆe�)€CÜ—’˜“€IØ�?€DØ×$Ñ$¤R§Y¡YÓ/€MØ
�‰*˜$ #™+¨=¸1Õ+<ÀÑ*BÕCÕ	D€BØ˜rŸy™y¬¯©Ó3Õ3€Hä�8Š8�L¨xÓ8€DØ�;‰;”r—x‘xÓ Ð r8   c                óÊ   € V ^8„  d   QhR\         \        \        P                  3,          R\         \        \        3,          R\         \        \        P                  3,          /# ©r1   ÚweightsÚquantization_configrB   )r   ÚstrrI   rJ   r   )r5   s   "r6   r7   r7   ›   sH   € ÷ 3ñ 3Ü”#”r—x‘x�-Õ ð3äœc¤3˜h�ð3ô 
Œ#Œr�x‰xˆ-Õñ3r8   c                óT  € Rp/ p\        V P                  4       4       EF  pVP                  V4      '       d±   VR\        V4      )  pW,          pW R2,          pW R2,          P	                  \
        P                  4      pVP                  \
        P                  4      W5 R2&   \        VP	                  \
        P                  4      ,          p	\        W˜,          4      W5 R2&   KË  VP                  R4      '       g   VP                  R4      '       d   Kû  W,          W4&   EK  	  V# )a  Fold compressed-tensors NVFP4 weights into MLX-native ``nvfp4`` weights.

A ``nvfp4-pack-quantized`` checkpoint stores, per quantized Linear:

- ``<p>.weight_packed``       ``uint8``  ``[out, in // 2]``
  (2x E2M1 per byte)
- ``<p>.weight_scale``        ``uint8``  ``[out, in // 16]``
  (E4M3 per group of 16, loaded by ``mx.load`` as raw bytes -- the same
  byte layout MLX uses for nvfp4 scales)
- ``<p>.weight_global_scale`` ``float32`` ``[1]`` (per-tensor; the real
  weight is ``fp4 * weight_scale / weight_global_scale``)

MLX ``nvfp4`` ``QuantizedLinear`` expects ``<p>.weight`` (``uint32``) plus
``<p>.scales`` (``uint8`` E4M3) and is single-level: the per-tensor global
scale is not representable (and is rejected on the Metal backend). Both
decodes are linear in the FP4 codes, so the global scale can be folded
directly into the per-group E4M3 scales:
``scale_mlx = E4M3(weight_scale / global_scale)``. We keep the original
packed E2M1 codes bit-exact, avoiding the weight dequantize/re-quantize
round-trip entirely.
ú.weight_packedNú.weight_scalez.weight_global_scaleú.weightú.scales)ÚlistÚkeysÚendswithÚlenra   rI   rU   rb   rc   Ú_E4M3_DECODE_LUTry   )
r|   r}   Úpacked_suffixÚnew_weightsr>   ÚprefixÚpackedÚscaleÚglobal_scaleÚdecodeds
   &&        r6   Ú+_transform_compressed_tensors_nvfp4_weightsr�   ›   sý   € ð2 %€Mà€KÜ�G—L‘L“N×#ˆØ�<‰<˜×&Ò&ØÐ.œC Ó.Ð.Ð/ˆFØ•\ˆFØ˜h mÐ4Õ5ˆEØ" XÐ-AÐ#BÕC×JÑJÌ2Ï:É:ÓVˆLð /5¯k©k¼"¿)¹)Ó.DˆK˜( 'Ð*Ñ+ô ' u§|¡|´B·I±IÓ'>Õ?ˆGÜ.:¸7Õ;QÓ.RˆK˜( 'Ð*Ó+Ø�\‰\˜/×*Ò*¨c¯l©lÐ;Q×.RÒ.Ráà&�|ˆKÔñ+ $ð. Ðr8   c          
      ó  € V ^8„  d   QhR\         \        \        P                  3,          R\         \        \        3,          R\
        \         \        \        P                  3,          \         \        \        3,          3,          /# r{   )r   r~   rI   rJ   r   r
   )r5   s   "r6   r7   r7   Ñ   s_   € ÷ +Sñ +SÜ”#”r—x‘x�-Õ ð+Säœc¤3˜h�ð+Sô Œ4””R—X‘X�Õ¤¤S¬# X¥Ð.Õ/ñ+Sr8   c                ó€  € VP                  R/ 4      P                  R/ 4      P                  R/ 4      pVP                  R^ 4      pVP                  R^4      pRp/ p\        V P                  4       4       F¾  pVP                  V4      '       dk   VR\	        V4      )  pW R2,          p	W,          P                  \        P                  4      Wh R	2&   W–V R
2&   ^V^,
          ,          ) V	,          Wh R2&   K„  VP                  R4      '       g   VP                  R4      '       d   K´  W,          Wg&   KÀ  	  VRVRVRR/3# )a¸  Remap compressed-tensors INT4 ``pack-quantized`` weights to MLX affine.

A symmetric int4 ``pack-quantized`` checkpoint stores, per quantized Linear:

- ``<p>.weight_packed`` ``int32`` ``[out, in // 8]``
  (8x int4 per word, LSB-first)
- ``<p>.weight_scale``  (``bf16``/``float``)
  ``[out, in // group_size]``
- ``<p>.weight_shape``  ``int64`` ``[2]`` (unused by MLX)

MLX affine ``QuantizedLinear`` uses the same int4 packing and dequantizes as
``w * scale + bias``. Symmetric int4 stores values in ``[0, 15]``
representing ``[-8, 7]``, i.e. ``value = packed - 8``, so we set
``bias = -8 * scale``. The packed ``int32`` is bit-identical to MLX's
``uint32`` layout (reinterpreted via ``view``).
Úconfig_groupsÚgroup_0r|   Ú
group_sizeÚnum_bitsr€   Nr�   r‚   rƒ   z.biasesz.weight_shaperh   ÚmodeÚaffine)Úgetr„   r…   r†   r‡   rb   rI   rc   )
r|   r}   Úweights_cfgr•   rh   r‰   rŠ   r>   r‹   r�   s
   &&        r6   Ú*_transform_compressed_tensors_int4_weightsr›   Ñ   s7  € ð* 	×Ñ °Ó4ß	‰ˆY˜Ó	ß	‰ˆY˜Ó	ð ð
 —‘ ¨rÓ2€JØ�?‰?˜: qÓ)€DØ$€Mà€KÜ�G—L‘L“NÖ#ˆØ�<‰<˜×&Ò&ØÐ.œC Ó.Ð.Ð/ˆFØ˜h mÐ4Õ5ˆEØ.5­l×.?Ñ.?ÄÇ	Á	Ó.JˆK˜( 'Ð*Ñ+Ø.3˜6˜( 'Ð*Ñ+Ø01°d¸QµhµÐ.@À5Õ.HˆK˜( 'Ð*Ó+Ø�\‰\˜/×*Ò*¨c¯l©l¸?×.KÒ.Káà&�|ˆKÓñ $ð ˜ z°6¸4ÀÈÐRÐRÐRr8   c                ó:  € V ^8„  d   QhR\         \        \        P                  3,          R\        \         \        \
        3,          ,          R\        \         \        \        P                  3,          \        \         \        \
        3,          ,          3,          /# r{   )r   r~   rI   rJ   r	   r   r
   )r5   s   "r6   r7   r7   ÿ   sd   € ÷ !ñ !Ü”#”r—x‘x�-Õ ð!ä!¤$¤s¬C x¥.Õ1ð!ô Œ4””R—X‘X�Õ¤¬¬c´3¨h­Õ 8Ð8Õ9ñ!r8   c                óJ  € Vf   V R3# VP                  R4      R8w  d   V R3# \        ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      '       g   V R3# VP                  R/ 4      P                  R/ 4      P                  R	/ 4      pVP                  R
4      ;'       g2    VP                  R/ 4      P                  R/ 4      P                  R
4      pVP                  R4      pVR8X  d   \        W4      R^R^RR/3# VR8X  d   VR8X  d   \        W4      # V R3# )zÛTransform compressed-tensors weights before model-specific sanitization.

This runs before MoE expert stacking so per-expert tensors have already been
renamed to MLX-native ``.weight`` / ``.scales`` / ``.biases`` keys.
NÚquant_methodúcompressed-tensorsc              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5i)r€   N)r†   )Ú.0r>   s   & r6   Ú	<genexpr>Ú8_transform_compressed_tensors_weights.<locals>.<genexpr>  s   é € ÐA¹°#�|‰|Ð,×-Ð-»ùs   ‚TFr“   r”   r|   r5   Útypeznvfp4-pack-quantizedr•   rh   r—   r   zpack-quantizedÚint)r™   Úanyr�   r›   )r|   r}   rš   Ú	ct_formatÚ
quant_types   &&   r6   Ú%_transform_compressed_tensors_weightsr©   ÿ   s7  € ð Ò"Ø˜ˆ}ÐØ×Ñ˜~Ó.Ð2FÔFØ˜ˆ}Ðß‹3ÑA¹ÓA�3�3Š3ÑA¹ÓA×AÒAØ˜ˆ}Ðð 	×Ñ °Ó4ß	‰ˆY˜Ó	ß	‰ˆY˜Ó	ð ð
 $×'Ñ'¨Ó1÷ 'ð 'Ð5H×5LÑ5LØ˜ó6ç	�cˆ)�RÓŸ™˜X›ð ð —‘ Ó(€JàÐ*Ô*Ü:Øó
à˜"˜f a¨°Ð9ð:ð 	:ð Ð$Ô$¨°uÔ)<Ü9¸'ÓWÐWà�Dˆ=Ðr8   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r1   ÚmodelrB   ©ÚnnÚModule)r5   s   "r6   r7   r7   #  s"   € ÷ ñ ¤§	¡	ð ¬b¯i©iñ r8   c                 óš   € R  R lp\        WP                  4       \        P                  P                  R7      pV P                  V4       V # )c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r1   ÚmrB   r¬   )r5   s   "r6   r7   Ú*quantize_activations.<locals>.__annotate__%  s"   € ÷ ñ ”R—Y‘Yð ¤2§9¡9ñ r8   c                ó  € \        V \        P                  4      '       dâ   V P                  \        9  d/   \        RV P                   RRP                  \        4       24      hV P                  RR4      '       d   \        R4      hV P                  P                  w  rV^ V P                  ,          ,          p\        P                  ! W!V P                  V P                  V P                  4      pVP                  4        V# V # )z:Convert a QuantizedLinear layer to QQLinear if compatible.zMode (z=) does not support activation quantization. Supported modes: ú, ÚbiasFz?Linear layer with bias does not support activation quantization)rD   r­   ÚQuantizedLinearr—   ÚACTIVATION_QUANTIZATION_MODESÚ
ValueErrorÚjoinr™   ÚweightÚshaperh   ÚQQLinearr•   Úquantize)r±   Úout_dimsÚin_dimsÚqqs   &   r6   Ú	_maybe_qqÚ'quantize_activations.<locals>._maybe_qq%  sÏ   € ä�aœ×+Ñ+×,Ò,Ø�v‰vÔ:Ô:Ü Ø˜QŸV™V˜Hð %(Ø(,¯	©	Ô2OÓ(PÐ'QðSóð ð �u‰u�V˜U×#Ò#Ü ØUóð ð !"§¡§¡ÑˆHØ�r˜QŸV™V•|Õ#ˆGÜ—’˜W°·±¸a¿f¹fÀaÇfÁfÓMˆBØ�K‰KŒMØˆIØˆr8   )Úis_leaf)r   Úleaf_modulesr­   r®   Ú	is_moduleÚupdate_modules)r«   rÁ   Úleavess   &  r6   Úquantize_activationsrÈ   #  s;   € õô( �i×!3Ñ!3Ó!5¼r¿y¹y×?RÑ?RÔS€FØ	×Ñ˜Ô à€Lr8   c                ó0   € V ^8„  d   QhR\         R\        /# ©r1   ÚpathrB   )r~   Úbool)r5   s   "r6   r7   r7   ?  s   € ÷ @ñ @¤ð @¬ñ @r8   c                ó|   a € Rp\         ;QJ d    V 3R lV 4       F  '       g   K   R# 	  R# ! V 3R lV 4       4      # )zÔ
Check if a multimodal module (vision/audio) should skip quantization.

Args:
    path: The module path to check

Returns:
    bool: True if the module is multimodal and should skip quantization, False otherwise
c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir:   © )r¡   ÚmodulerË   s   & €r6   r¢   Ú)skip_multimodal_module.<locals>.<genexpr>T  s   øé € Ð?Ñ,> &˜Ž~Ó,>ùs   ƒTF)	Úvision_modelÚvision_towerÚvl_connectorÚ	sam_modelÚaudio_modelÚaudio_towerÚcode_predictorÚimg_projectorÚmulti_modal_projector©r¦   )rË   Úmultimodal_moduless   f r6   Úskip_multimodal_modulerÝ   ?  s8   ø€ ð
Ð÷ ‹3Ô?Ñ,>Ó?�3Œ3Ð?Š3Ð?ˆ3Ô?Ñ,>Ó?Ó?Ð?r8   c                óˆ   € V ^8„  d   QhR\         R\        \        \         \        P                  3,          ,          R\
        /# )r1   rË   r|   rB   )r~   r	   r   rI   rJ   rÌ   )r5   s   "r6   r7   r7   W  s4   € ÷ ?ñ ?¤ð ?¬x¼¼SÄ"Ç(Á(¸]Õ8KÕ/Lð ?ÔQUñ ?r8   c                 ó*   € VR J;'       d	    V  R2V9   # )Nrƒ   rÏ   )rË   r|   s   &&r6   Ú_has_quantized_weightsrà   W  s!   € Ø˜$Ð×>Ð> d V¨7Ð#3°wÑ#>Ð>r8   Fc                 ó   a aa€ VV V3R  lpV# )c                 ó6  <€ \        V 4      '       d   S'       d   \        V S4      '       g   R # Se   V S9   d
   SV ,          # \        VR4      '       g   R # \        VR4      '       d%   VP                  P                  ^@,          ^ 8w  d   R # Se	   V  R2S9   # R# )FÚto_quantizedrº   rƒ   T©rÝ   rà   Úhasattrrº   Úsize)Úpr±   r}   Úskip_visionr|   s   &&€€€r6   Ú	predicateÚ&get_class_predicate.<locals>.predicate\  sˆ   ø€ ä" 1×%Ò%ßÜ*¨1¨g×6Ò6áØÒ*¨qÐ4GÔ/GØ& qÕ)Ð)Ü�q˜.×)Ò)ÙÜ�1�h×Ò A§H¡H§M¡M°BÕ$6¸!Ô$;ÙØÒØ�S˜�= GÑ+Ð+Ùr8   rÏ   )rè   r|   r}   ré   s   fff r6   Úget_class_predicaterë   [  s   ú€ ÷ð" Ðr8   c                ó$   € V ^8„  d   QhR\         /# r0   r3   )r5   s   "r6   r7   r7   p  s   € ÷ &ñ &œtñ &r8   c                ó\  € V P                  R4      ;'       g    V P                  R4      pVf   \        R4      hVP                  4       p\        P                  W"4      pV P                  RR4      RJpV'       d
   VR,          pRpR F"  p \        P
                  ! V RV 24      pWb3u # 	  \        V 4      '       d   \        P
                  ! R4      pVR3# R	V R
V 2p\        P                  ! V4       \        V4      h  \         d   pT\        T4      9  d   h Tp Rp?Kž  Rp?ii ; i)z´
Retrieve the model object based on the configuration.

Args:
    config (dict): The model configuration.

Returns:
    A tuple containing the Model class and the ModelArgs class.
Ú
model_typeÚspeculators_model_typeNÚdflash_configÚ_dflashÚ.zmlx_vlm.models.text_onlyÚ	text_onlyzModel type z not supported. Error: )zmlx_vlm.modelszmlx_vlm.speculative.drafters)r™   ÚKeyErrorÚlowerÚMODEL_REMAPPINGÚ	importlibÚimport_moduleÚImportErrorr~   Ú_is_text_only_configÚloggingÚerrorr¸   )	r2   Úraw_model_typerî   Ú	is_dflashÚlast_errÚpkgÚarchÚeÚmsgs	   &        r6   Úget_model_and_argsr  p  s)  € ð —Z‘Z Ó-×UÐU°·±Ð<TÓ1U€NØÒÜ�|Ó$Ð$Ø×%Ñ%Ó'€Jä ×$Ñ$ ZÓ<€Jà—
‘
˜?¨DÓ1¸Ð=€IßØ�iÕˆ
à&*€HÛAˆð	Ü×*Ò*¨c¨U°!°J°<Ð+@ÓAˆDØÐ#Ò#ñ Bô ˜F×#Ò#Ü×&Ò&Ð'AÓBˆØ�[Ð Ð à˜
�|Ð#:¸8¸*Ð
E€CÜ‡M‚M�#ÔÜ
�S‹/Ðøô ô 	Ø¤ Q£Ô'ØØˆHÝûð		ús   ÂDÄD+ÄD&Ä&D+c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r1   r2   r>   rB   )r4   r~   rÌ   )r5   s   "r6   r7   r7   ™  s!   € ÷ -ñ -œð -¤3ð -¬4ñ -r8   c                 óF   € V P                  V4      pVR J;'       d    V/ 8g  # r:   )r™   )r2   r>   r[   s   && r6   Ú_has_configr  ™  s&   € Ø�J‰J�s‹O€EØ˜Ð×,Ð, ¨"¡Ð,r8   c                ó0   € V ^8„  d   QhR\         R\        /# )r1   r2   rB   )r4   rÌ   )r5   s   "r6   r7   r7   ž  s   € ÷ ñ ¤ð ¬$ñ r8   c                 ó–   a € \         ;QJ d)    V 3R  lR 4       F  '       g   K   R'       * # 	  R'       * # ! V 3R  lR 4       4      '       * # )c              3   ó<   <"  € T F  p\        SV4      x € K  	  R # 5ir:   )r  )r¡   r>   r2   s   & €r6   r¢   Ú'_is_text_only_config.<locals>.<genexpr>Ÿ  s"   øé € ð áEˆCô 	�F˜C× Ð ÛEùs   ƒTF)Úvision_configÚaudio_configrð   rÛ   ©r2   s   fr6   rú   rú   ž  sM   ø€ ß‹sô áEó�sŒsô ð Šsô ð ˆsô áEóó ô ð r8   c          
      ó–   € V ^8„  d   QhR\         R\        \         ,          R\        R\        \        \         ,          ,          R\        /# )r1   Úpath_or_hf_repoÚrevisionÚforce_downloadÚallow_patternsrB   )r~   r	   rÌ   r   r   )r5   s   "r6   r7   r7   ¥  sG   € ÷ $ñ $Üð$ä”s�mð$ô ð$ô œT¤#�YÕ'ð	$ô
 
ñ$r8   c           	     ó�   € \        V 4      pVP                  4       '       g%   \        \        T TT;'       g    . ROVR7      4      pV# )ab  
Ensures the model is available locally. If the path does not exist locally,
it is downloaded from the Hugging Face Hub.

Args:
    path_or_hf_repo (str): The local path or Hugging Face repository ID of the model.
    revision (str, optional): A revision id which can be a branch name, a tag, or a commit hash.

Returns:
    Path: The path to the model.
)Úrepo_idr  r  r  )z*.jsonú*.safetensorsz*.pyz*.modelz
*.tiktokenz*.txtz*.jinja)r   Úexistsr   )r  r  r  r  Ú
model_paths   &&&& r6   Úget_model_pathr  ¥  sT   € ô" �oÓ&€JØ×Ñ×ÒÜÜØ'Ø!Ø-÷ 	 ð 	 òð  .ôó
ˆ
ð" Ðr8   c                óP   € V ^8„  d   QhR\         R\        R\        P                  /# ©r1   r  ÚlazyrB   )r   rÌ   r­   r®   )r5   s   "r6   r7   r7   Ì  s*   € ÷ Mñ Mœ4ð M¤tð MÄ"Ç)Á)ñ Mr8   c           	     óø  aaa€ \        V 3/ VB o\        P                  ! \        V R,          4      4       Uu. uF  pVP                  R4      '       d   K  VNK   	  ppV'       g+   \        P
                  ! RV  24       RV  R2p\        V4      h/ oV F  pSP                  \        V4      4       K  	  \        P                  ! V^ ,          RR7      ;_uu_ 4       pVP                  4       ;'       d#    VP                  4       P                  R4      R	8H  pR
R
R
4       \        SR7      w  r‰SP                  RSP                  R/ 4      4       SP                  R/ 4       SP                  R/ 4       RS9   p
VP                   P#                  S4      p. R*Op\%        W¸SV4      p\'        VS4      pVP)                  V4      pSP                  RR
4      pVf,   SP                  R/ 4      P                  RR
4      pVe   VSR&   \+        SV4      w  opVe   VSR&   VSR&   X'       Egw   \-        VS4      o\/        VR4      '       dÀ   \/        VP0                  R4      '       d¤   \-        VP0                  S4      o\-        VP0                  P2                  S4      o\-        VP0                  P4                  S4      o\-        VP0                  P6                  S4      o\-        VP8                  S4      o\-        VP:                  S4      oM™\/        VR4      '       d"   \-        VP<                  SVP>                  4      o\/        VR4      '       d"   \-        VP@                  SVPB                  4      o\/        VR4      '       d"   \-        VPD                  SVPF                  4      oV
'       gÓ   SP                  RR
4      pVf.   SP                  R/ 4      pVP                  RR
4      pVe   VSR&   VeŒ   VP                  R4      pR
pVR8X  d
   R^ R^RR/pMZVR8X  d
   R^ R^RR/pMJVR8X  d&   SP                  R4      R 8X  d   ^R!I$H%p V! V4      pMVR+9   d   \        PL                  ! R"V4       Ve   VSR&   VSR&   V
'       d"   R, F  p\O        VVR
4      pVf   K  VSV&   K  	  SP                  RR
4      ;pe�   SP                  R/ 4      P                  R#R$4      o\O        VR%R$4      '       d   VP6                  PP                  MTpVVV3R& lp\R        PT                  ! VVR,          VR,          VP                  RR4      VR'7       VP                  R(R$4      '       d   Vf   \W        R)4      h\Y        V4      pVP[                  \]        SP_                  4       4      4       V'       g%   \`        Pb                  ! VPe                  4       4       Wn3        VPc                  4        V# u upi   + '       g   i     ELÚ; i)-ay  
Load and initialize the model from a given path.

Args:
    model_path (Path): The path to load the model from.
    lazy (bool): If False eval the model parameters to make sure they are
        loaded in memory before returning, otherwise they will be loaded
        when needed. Default: ``False``
    revision (str, optional): A revision id which can be a branch name,
        a tag, or a commit hash. Default: ``None``.
    quantize_activations (bool, optional): If True, convert QuantizedLinear layers
        to QQLinear layers for activation quantization. Only supported for models
        quantized with 'nvfp4' or 'mxfp8' modes. Default: ``False``.

Returns:
    nn.Module: The loaded and initialized model.

Raises:
    FileNotFoundError: If the weight files (.safetensors) are not found.
    ValueError: If the model class or args class are not found or cannot be instantiated.
r  zconsolidated.safetensorszNo safetensors found in z
No safetensors found in aè  
Create safetensors using the following code:
```
from transformers import AutoModelForCausalLM, AutoProcessor

model_id = "<huggingface_model_id>"
model = AutoModelForCausalLM.from_pretrained(model_id)
processor = AutoProcessor.from_pretrained(model_id)

model.save_pretrained("<local_dir>")
processor.save_pretrained("<local_dir>")
```
Then use the <local_dir> as the --hf-path in the convert script.
```
python -m mlx_vlm.convert --hf-path <local_dir> --mlx-path <mlx_dir>
```
        Únp)Ú	frameworkr5   ÚmlxNr  Útext_configÚ
llm_configr  r  Úquantizationr}   ÚthinkerÚsanitizeÚVisionModelÚLanguageModelÚ
AudioModelrž   rŸ   r•   rh   r—   r˜   Úmxfp4Úfp8rî   Údeepseek_v4)Úmake_quantization_configz?Quantization method %s is not supported in mlx_vlm.load_model()rè   FÚ_is_text_modelc                 ó>  <€ \        V 4      '       d   S'       d   \        V S4      '       g   R # V SR,          9   d   SR,          V ,          # \        VR4      '       g   R # \        VR4      '       d%   VP                  P                  ^@,          ^ 8w  d   R # V  R2S9   # )Fr#  rã   rº   rƒ   rä   )rç   r±   r2   rè   r|   s   &&€€€r6   rë   Ú'load_model.<locals>.get_class_predicaten  s…   ø€ ô ' q×)Ò)ßÜ.¨q°'×:Ò:áà�F˜>Õ*Ô*Ø˜nÕ-¨aÕ0Ð0Ü˜1˜n×-Ò-Ùä�q˜(×#Ò#¨¯©¯©¸Õ(:¸aÔ(?Ùà�S˜�= GÑ+Ð+r8   )r•   rh   r—   Úclass_predicaterÈ   z|Activation quantization requires the model to be quantized first. Please use a quantized model with mode 'nvfp4' or 'mxfp8'.)ÚtextÚvisionÚ	perceiverÚ	projectorÚaudio)ÚawqÚgptqÚbitnet)r#  r}   )4Úload_configÚglobr~   r†   rû   rü   ÚFileNotFoundErrorÚupdateÚ_load_safetensorsÚsafetensorsÚ	safe_openÚmetadatar™   r  Ú
setdefaultÚpopÚModelConfigÚ	from_dictÚupdate_module_configsr?   ÚModelr©   Úsanitize_weightsrå   r$  rÓ   r×   Úlanguage_modelÚcode2wavÚtalkerr&  r  r'  r!  r(  r  Úmodels.deepseek_v4.languager,  ÚwarningÚgetattrÚ_modelr­   r½   r¸   rÈ   Úload_weightsr„   ÚitemsrI   ÚevalÚ
parametersr  )r  r  ÚkwargsÚwfÚweight_filesÚmessageÚfÚis_mlx_formatÚmodel_classÚ_Úhas_quantizationr=   Úmodulesr«   r}   Útransformed_quantizationr!  rž   r#  r,  Úquantization_keyÚquantization_valueÚquantized_modelrë   r2   rè   r|   s   &&,                     @@@r6   Ú
load_modelra  Ì  s—  ú€ ô, ˜Ñ. vÑ.€Fô
 —)’)œC 
¨_Õ <Ó=Ô>óá>ˆBØ�{‰{Ð5×6÷ 	ˆÙ>ð ð ÷ Ü�ŠÐ0°°Ð=Ô>ðØ#˜ð %	ðˆô$   Ó(Ð(à€GÛˆØ�‰Ô(¨Ó,Ö-ñ ô 
×	Ò	˜|¨A�¸$×	?Õ	?À1ØŸ
™
›×LÐL¨¯©«×)9Ñ)9¸(Ó)CÀuÑ)Lˆ÷ 
@ô (¨vÔ6�N€Kð ×Ñ�m V§Z¡Z°¸bÓ%AÔBØ
×Ñ�o rÔ*Ø
×Ñ�n bÔ)à%¨Ñ/Ðð ×*Ñ*×4Ñ4°VÓ<€LÚC€GÜ(¨ÀFÈGÓT€LÜ3°LÀ&ÓI€Là×Ñ˜lÓ+€Eà Ÿ*™*Ð%:¸DÓAÐØÒ"Ø$Ÿj™j¨¸Ó;×?Ñ?Ø! 4ó
Ðð Ò*Ø,?ˆFÐ(Ñ)ä(MØÐ$ó)Ñ%€GÐ%ð  Ò+Ø!9ˆˆ~ÑØ(@ˆÐ$Ñ%çˆ=ä" 5¨'Ó2ˆä�5˜)×$Ò$¬°·±À
×)KÒ)KÜ& u§}¡}°gÓ>ˆGÜ& u§}¡}×'AÑ'AÀ7ÓKˆGÜ& u§}¡}×'@Ñ'@À'ÓJˆGÜ& u§}¡}×'CÑ'CÀWÓMˆGÜ& u§~¡~°wÓ?ˆGÜ& u§|¡|°WÓ=‰Gä�{ M×2Ò2Ü*Ø×+Ñ+¨W°l×6PÑ6Pó�ô �{ O×4Ò4Ü*Ø×-Ñ-¨w¸×8PÑ8Pó�ô �{ L×1Ò1Ü*Ø×*Ñ*¨G°\×5NÑ5Nó�÷ Ø$Ÿj™jÐ)>ÀÓEÐØÒ&Ø Ÿ*™* ]°BÓ7ˆKØ"-§/¡/Ð2GÈÓ"NÐØ"Ò.Ø0C�Ð,Ñ-àÒ*Ø.×2Ñ2°>ÓBˆLØˆLØÐ3Ô3Ø ,¨b°&¸!¸VÀXÐN‘Ø Ô(Ø ,¨b°&¸!¸VÀWÐM‘Ø Ô&¨6¯:©:°lÓ+CÀ}Ô+TÝQá7¸Ó>‘ØÐ!:Ô:Ü—’ØUØ ôð
 Ò'Ø)5��~Ñ&Ø0<�Ð,Ñ-çÛ GÐÜ!(¨Ð7GÈÓ!NÐØ!Ô-Ø+=�Ð'Ó(ñ !Hð
 Ÿ
™
 >°4Ó8Ð8ˆÒEð —j‘j °"Ó5×9Ñ9¸-ÈÓOˆô �uÐ.°×6Ò6ð × Ñ ×'Ò'àð 	÷	,ô( 	�ŠØØ# LÕ1Ø˜fÕ%Ø×!Ñ! &¨(Ó3Ø/õ	
ð ‡z�zÐ(¨%×0Ò0ØÒÜðMóð ô % UÓ+ˆà	×Ñ”t˜GŸM™M›OÓ,Ô-çÜ
�Š�× Ñ Ó"Ô#à!ÔØ	‡J�J„LØ€Lùòi÷@ 
@×	?Ð	?ús   ¸W#ÁW#Ã;W(×(W9	c                ó0   € V ^8„  d   QhR\         R\        /# rÊ   )r~   r4   )r5   s   "r6   r7   r7   œ  s   € ÷ )ñ )œCð )¤Dñ )r8   c           	      ó  a
€  \         P                  ! V 4      #   \         dV   o
\        ;QJ d#    T
3R  l\         4       F  '       g   K   RM	  RM! T
3R  l\         4       4      '       g   h S
p Ro
>
MRo
>
ii ; i\        T R4      ;_uu_ 4       p\        P                  ! RTP                  ^4      4      ^ ,          pTP                  T4      p\        P                  ! T4      pRpTP                  4        FK  p\        T\        4      '       g   K  TP                  R4      pT\        9   g   K9  \        T,          TR&   RpKM  	  T'       g   Th\        P                  ! TRR7      P!                  R4      p	\#        T	4      T8”  d   \        R	T  R
24      h TP%                  ^4       TP'                  T	4       TP'                  RT\#        T	4      ,
          ,          4       TP)                  4        \         P                  ! T 4      TP%                  ^4       TP'                  T4       TP)                  4        uuRRR4       #   TP%                  ^4       TP'                  T4       TP)                  4        i ; i  + '       g   i     R# ; i)c              3   ó>   <"  € T F  q\        S4      9   x € K  	  R # 5ir:   ©r~   )r¡   rQ   r  s   & €r6   r¢   Ú$_load_safetensors.<locals>.<genexpr>   s   øé € ÐLÑ0K uœC ›F–?Ó0Kùs   ƒTFNzr+bz<QrQ   )Ú
separatorsúutf-8z4Cannot reinterpret unsupported safetensors dtype in z4: patched header is larger than the original header.ó    )Ú,Ú:)rI   ÚloadÚRuntimeErrorr¦   ÚSAFETENSORS_DTYPE_FALLBACKSÚopenÚstructÚunpackÚreadÚjsonÚloadsÚvaluesrD   r4   r™   ÚdumpsÚencoder‡   ÚseekÚwriteÚflush)rË   Ú
load_errorrW  Ú
header_lenÚoriginal_headerÚheaderÚchangedÚtensor_inforQ   Úpatched_headerr  s   &         @r6   r=  r=  œ  sä  ø€ ðÜ�wŠw�t‹}ÐøÜô ß‹sÔLÕ0KÓL�s�sŠsÔLÕ0KÓL×LÒLØØ�
ûðúô
 
ˆd�E×	Ô	˜aÜ—]’] 4¨¯©°«Ó3°AÕ6ˆ
ØŸ&™& Ó,ˆÜ—’˜OÓ,ˆØˆà!Ÿ=™=ž?ˆKÜ˜k¬4×0Ò0ÙØ—O‘O GÓ,ˆEØÔ3Ö3Ü'BÀ5Õ'I�˜GÑ$Ø’ñ +÷ ØÐäŸš F°zÔB×IÑIÈ'ÓRˆÜˆ~Ó Ô+ÜØFÀtÀfð MEð Eóð ð
		Ø�F‰F�1ŒIØ�G‰G�NÔ#Ø�G‰G�D˜J¬¨^Ó)<Õ<Õ=Ô>Ø�G‰GŒIÜ—7’7˜4“=à�F‰F�1ŒIØ�G‰G�OÔ$Ø�G‰GŒI÷C 
Ò	øð> �F‰F�1ŒIØ�G‰G�OÔ$Ø�G‰G�Iú÷C 
×	Ð	úsS   ƒ ™A9¤#A4Á
!A4Á,A4Á4A9ÂBI:Ä0I:ÅAI:ÆA/IÈ2I:É4I7É7I:É:J	c                ód   € \        V R4      '       d   Ve	   V ! V4      p V P                  V4      pV# )zFHelper function to sanitize weights if the model has a sanitize methodr%  )rå   r%  )Ú	model_objr|   r2   s   &&&r6   rG  rG  È  s4   € äˆy˜*×%Ò%ØÒÙ! &Ó)ˆIØ×$Ñ$ WÓ-ˆØ€Nr8   c           	     óì   € V Fm  pV R2p\        W4      '       g   K  VP                  V4      f   K0  \        WP                  4        R24      p\	        WVP                  W%,          4      4       Ko  	  V # )a“  Updates configuration for model modules like text and vision modules.

Args:
    model_config: The model configuration object that will be updated
    model_class: The model class containing component config classes
    config: Dictionary containing configuration parameters
    modules: List of module names to update configs for (e.g. ["text", "vision"])

Returns:
    The updated model_config object
Ú_configÚConfig)rå   r™   rM  Útitler<   rD  )r=   rY  r2   r\  Úconfig_nameÚconfig_attrÚconfig_classs   &&&&   r6   rE  rE  Ñ  sq   € ó ˆØ$˜ WÐ-ˆÜ�<×-Ô-°&·*±*¸[Ó2IÔ2UÜ" ;×3DÑ3DÓ3FÐ2GÀvÐ0NÓOˆLÜØ¨<×+AÑ+AÀ&ÕBUÓ+Vöñ	 ð Ðr8   c                óÂ   € V ^8„  d   QhR\         R\        \         ,          R\        R\        \         ,          R\        R\        \        P
                  \        3,          /# )r1   r  Úadapter_pathr  r  ÚstrictrB   )r~   r	   rÌ   r
   r­   r®   r   )r5   s   "r6   r7   r7   ç  sZ   € ÷ 6ñ 6Üð6äœ3•-ð6ô ð6ô ”s�mð	6ô
 ð6ô Œ2�9‰9”nÐ$Õ%ñ6r8   c                ó  € VP                  RR4      p\        WVR7      p\        Wr3RV/VB pVe   \        W�4      pVP	                  4        \        V3/ VB p	\        VP                  RR4      p
\        VR3RV
/VB pV	e   W›n	        W‹3# )	a8  
Load the model and tokenizer from a given path or a huggingface repository.

Args:
    path_or_hf_repo (str): The path or the huggingface repository to load the model from.
    tokenizer_config (dict, optional): Configuration parameters specifically for the tokenizer.
        Defaults to an empty dictionary.
    adapter_path (str, optional): Path to the LoRA adapters. If provided, applies LoRA layers
        to the model. Default: ``None``.
    lazy (bool): If False eval the model parameters to make sure they are
        loaded in memory before returning, otherwise they will be loaded
        when needed. Default: ``False``
    revision (str, optional): A revision id which can be a branch name,
        a tag, or a commit hash. Default: ``None``.
    strict (bool): Whether or not to raise an exception if weights don't
        match. Default: ``True``.
    quantize_activations (bool, optional): If True, convert QuantizedLinear layers
        to QQLinear layers for activation quantization. Only supported for models
        quantized with 'nvfp4' or 'mxfp8' modes. Default: ``False``.

Returns:
    Tuple[nn.Module, TokenizerWrapper]: A tuple containing the loaded model and tokenizer.

Raises:
    FileNotFoundError: If config file or safetensors are not found.
    ValueError: If model class or args class are not found.
r  F)r  r  r�  NÚeos_token_idTÚeos_token_ids)
r™   r  ra  r   rQ  Úload_image_processorrM  r2   Úload_processorÚimage_processor)r  rŒ  r  r  r�  rS  r  r  r«   r“  r�  Ú	processors   &&&&&,      r6   rl  rl  ç  s¢   € ðF —Z‘ZÐ 0°%Ó8€NÜØÀô€Jô �zÑA°ÐA¸&ÑA€EØÒÜ! %Ó6ˆØ�
‰
Œä*¨:Ñ@¸Ñ@€Oô ˜5Ÿ<™<¨¸Ó>€Lä˜z¨4ÑV¸|ÐVÈvÑV€IàÒ"Ø$3Ô!àÐÐr8   c                ó¬   € V ^8„  d   QhR\         \        P                  P                  ,          R\         \        P                  P                  ,          /# )r1   Útensor_groupÚpipeline_group)r	   rI   ÚdistributedÚGroup)r5   s   "r6   r7   r7      s<   € ÷ 2ñ 2äœ2Ÿ>™>×/Ñ/Õ0ð2ô œRŸ^™^×1Ñ1Õ2ñ2r8   c                 óœ  € \        V 4      p\        VR RR7      pVP                  P                  4       p\	        VR4      pVe   V'       g   \        R4      hVf+   Vf'   V'       d   \        P                  P                  4       p\        VR VP                  RR4      R7      p\        V4      pVe   W‡n        Ve   VP                  V4       Ve[   VP                  p	\	        V	R4      '       d   V	P                  MT	p
\	        V
R	4      '       g   \        R
4      hV
P!                  V4       \#        R4       \        P$                  ! VP                  P'                  4       4       VP%                  4        \        P$                  ! \        P                  P)                  \        P*                  ! R4      \        P,                  R7      4       WG3# )TF)r  r�  ÚshardNzMThe model does not support tensor parallelism but a tensor_group was providedr�  ©r�  r«   Úpipelinez/The model does not support pipeline parallelismÚMaterializingrO   )Ústream)r  ra  r2   Úto_dictrå   r¸   rI   r˜  Úinitr’  r™   r‘  r“  r›  rH  r«   r�  ÚprintrQ  rR  Úall_sumrJ   Úcpu)Úrepor–  r—  r  r«   r2   Úhas_tensor_parallelr”  r“  ÚlmÚinners   &&&        r6   Úsharded_loadr©     sn  € ô   Ó%€Jô �z¨°UÔ;€EØ�\‰\×!Ñ!Ó#€Fä! %¨Ó1ÐàÒ×(;ÜØ[ó
ð 	
ð Ò Ò 6ßÜŸ>™>×.Ñ.Ó0ˆLäØ�D¨¯
©
°>À4Ó(Hô€Iô +¨:Ó6€OØÒ"Ø$3Ô!àÒØ�‰�LÔ!àÒ!Ø×!Ñ!ˆä# B¨×0Ò0�—’°bˆÜ�u˜j×)Ò)ÜÐNÓOÐOØ�‰�~Ô&ä	ˆ/ÔÜ‡G‚GˆE× Ñ ×+Ñ+Ó-Ô.Ø	‡J�J„Lô ‡G‚GŒB�N‰N×"Ñ"¤2§8¢8¨C£=¼¿¹Ð"Ó@ÔAàÐÐr8   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# ©r1   r  rB   )r   r~   r   r4   )r5   s   "r6   r7   r7   U  s'   € ÷ #Nñ #NœE¤#¤t )Õ,ð #N¼4ñ #Nr8   c                óŽ  € \        V \        4      '       d.   \        V VP                  R4      VP                  RR4      R7      p  \	        V R,          RR7      ;_uu_ 4       p\
        P                  ! V4      pRRR4       V R	,          pVP                  4       '       dB    \	        VRR7      ;_uu_ 4       p\        X\
        P                  ! V4      4       RRR4       V# X#   + '       g   i     Lr; i  + '       g   i     X# ; i  \
        P                   d     X# i ; i  \         d   p\        R
T  24      ThRp?ii ; i)aA  Load model configuration from a path or Hugging Face repo.

Args:
    model_path: Local path or Hugging Face repo ID to load config from
    **kwargs: Additional keyword arguments to pass to the config loader

Returns:
    dict: Model configuration

Raises:
    FileNotFoundError: If config.json is not found at the path
r  r  F©r  r  zconfig.jsonrh  )ÚencodingNzgeneration_config.jsonzConfig not found at )rD   r~   r  r™   ro  rs  rl  r  rE   ÚJSONDecodeErrorr;  )r  rS  rW  r2   Úgeneration_config_fileÚexcs   &,    r6   r9  r9  U  s  € ô �*œc×"Ò"Ü#ØØ—Z‘Z 
Ó+Ø!Ÿ:™:Ð&6¸Ó>ô
ˆ
ðNÜ�*˜}Õ,°w×?Õ?À1Ü—Y’Y˜q“\ˆF÷ @ð ",Ð.FÕ!FÐØ!×(Ñ(×*Ò*ðÜÐ0¸7×CÕCÀqÜ,¨V´T·Y²Y¸q³\ÔB÷ Dð
 ˆˆvˆ÷ @×?ú÷ DÖCð
 ˆûô ×'Ñ'ô Øàˆðûô
 ô NÜÐ"6°z°lÐ CÓDÈ#ÐMûðNús~   ÁD% Á!C"Á8&D% Â D	 Â5!C5ÃD	 ÃD% Ã D% Ã"C2	Ã-D% Ã5D	Ä D	 ÄD% ÄD	 Ä	D"ÄD% Ä!D"Ä"D% Ä%EÄ0D?Ä?Ec                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# r«  )r   r~   r   r   )r5   s   "r6   r7   r7   {  s$   € ÷ ñ ¤U¬3´¨9Õ%5ð ÔDVñ r8   c                 óö  € \        V \        4      '       d.   \        V VP                  R 4      VP                  RR4      R7      p V'       g   \	        V RR7      pM\	        V 3/ VB p \        V4      w  r4Rp\        TR4      '       d`   \        P                  ! TP                  P                  4      pRTP                  9   d   TP                  TR	7      pT# TP                  4       pT#   \         d     R# i ; i)
r  r  Fr­  T)Útrust_remote_codeNÚImageProcessorr2   r  )rD   r~   r  r™   r9  r  r¸   rå   ÚinspectÚ	signaturerµ  Ú__init__rR  )r  rS  r2   rY  rZ  r“  Úinit_signatures   &,     r6   r‘  r‘  {  sì   € Ü�*œc×"Ò"Ü#ØØ—Z‘Z 
Ó+Ø!Ÿ:™:Ð&6¸Ó>ô
ˆ
÷ Ü˜Z¸4Ô@‰ä˜ZÑ2¨6Ñ2ˆðÜ+¨FÓ3‰ˆð €Oäˆ{Ð,×-Ò-Ü ×*Ò*¨;×+EÑ+E×+NÑ+NÓOˆà�~×0Ñ0Ô0Ø)×8Ñ8ÀÐ8ÓGˆOð Ðð *×8Ñ8Ó:ˆOàÐøô ô Úðús   Á'C) Ã)C8Ã7C8c                ó$   € V ^8„  d   QhR\         /# rG   r   )r5   s   "r6   r7   r7   ™  s   € ÷ ñ äñr8   c                 óz  € \         P                  ! V 3/ VB pV'       dœ   \        V R R7      p\        VR4      '       d   VP                  MTpV! V4      Vn        T;'       g#    \        VRR4      ;'       g    \        VRR4      p\        Wv4      p\        VR4      '       d   W„P                  n        V# W„n        V# )F)Úreturn_tokenizerÚ	tokenizerr�  Nr�  )	r   Úfrom_pretrainedr   rå   r½  ÚdetokenizerrM  ÚStoppingCriteriaÚstopping_criteria)	r  Úadd_detokenizerr�  rS  r”  Údetokenizer_classÚtokenizer_objÚfinal_eos_token_idsÚcriterias	   &&&,     r6   r’  r’  ™  sÈ   € ô ×-Ò-¨jÑC¸FÑC€IßÜ*¨:ÈÔNÐô $+¨9°k×#BÒ#BˆI×ÒÈ	ð 	ñ
 !2°-Ó @ˆ	Ôð ÷ <ð <Ü�} o°tÓ<÷<ð <ä�} n°dÓ;ð 	ô $Ð$7ÓGˆÜ�9˜k×*Ò*Ø4<×ÑÔ1ð Ðð +3Ô'àÐr8   c          	      ó|   € V ^8„  d   QhR\         R\        R\        \        P                  \
        \        3,          /# r  )r   rÌ   r
   r­   r®   r4   r   )r5   s   "r6   r7   r7   º  s4   € ÷ $ñ $Üð$Ü ð$ä
Œ2�9‰9”dœNÐ*Õ+ñ$r8   c           
      óz   € \        W3/ VB p\        V 3/ VB p\        V 3R RRVP                  RR4      /VB pW4V3# )rÂ  Fr�  r�  N)ra  r9  r’  r™   )r  r  rS  r«   r2   r”  s   &&,   r6   Úfetch_from_hubrÉ  º  sc   € ô �zÑ2¨6Ñ2€EÜ˜Ñ. vÑ.€FÜØñàðð —j‘j °Ó6ðð ñ	€Ið ˜)Ð#Ð#r8   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r1   r|   Úmax_file_size_gbrB   )r4   r¥   r„   )r5   s   "r6   r7   r7   È  s!   € ÷ ñ œð ´ð ÌDñ r8   c                óø   € V^,          p. p/ ^ rTV P                  4        FF  w  rgWWP                  ,           V8”  d   VP                  V4       / ^ rTWtV&   WWP                  ,          pKH  	  VP                  V4       V# )zÃ
Splits the weights into smaller shards.

Args:
    weights (dict): Model weights.
    max_file_size_gb (int): Maximum size of each shard in gigabytes.

Returns:
    list: List of weight shards.
)rP  ÚnbytesrT   )r|   rË  Úmax_file_size_bytesÚshardsr›  Ú
shard_sizeÚkÚvs   &&      r6   Úmake_shardsrÓ  È  sv   € ð +¨bÕ0ÐØ€FØ˜Aˆ:Ø—‘–‰ˆØŸ™Õ Ð#6Ô6Ø�M‰M˜%Ô Ø " A�:Øˆa‰Ø—h‘hÕŠ
ñ  ð ‡M�M�%ÔØ€Mr8   c                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# )r1   rË   Úhf_path)r   r~   r   r	   )r5   s   "r6   r7   r7   à  s3   € ÷ (ñ (Ü
””T�	Õ
ð(Ü%-¬e´C¼°IÕ.>Õ%?ñ(r8   c                óF  € ^ RI HpHp Vf   VP                  V! RR7      4      pMVP	                  V4      pRVP
                  n        VP
                  P                  f   RVP
                  n        VP
                  P                  f   R.VP
                  n        M?RVP
                  P                  9  d%   VP
                  ;P                  R.,          un        Ve   \        V4      VP
                  n
        RVn        VP                  \        V 4      R,          4       R# )	zà
Create model card for a converted MLX model.

Args:
    path (Union[str, Path]): Local path to the converted model.
    hf_path (Optional[Union[str, Path]]): Original Hugging Face repo id or local path used for conversion.
)Ú	ModelCardÚModelCardDataNÚen)Úlanguager   zimage-text-to-textÚ ú	README.md)Úhuggingface_hubr×  rØ  Úfrom_templaterl  ÚdataÚlibrary_nameÚpipeline_tagÚtagsr~   Ú
base_modelr1  Úsaver   )rË   rÕ  r×  rØ  Úcards   &&   r6   Úcreate_model_cardræ  à  sÈ   € ÷ 9à‚Ø×&Ñ&¡}¸dÔ'CÓD‰à�~‰~˜gÓ&ˆØ"€D‡I�IÔØ‡y�y×ÑÒ%Ø!5ˆ�	‰	ÔØ‡y�y‡~�~ÒØ˜ˆ�	‰	�Ø	�d—i‘i—n‘nÔ	$Ø�	‰	�Š˜5˜'Õ!�ØÒÜ" 7›|ˆ�	‰	ÔØ€D„IØ‡I�IŒd�4‹j˜;Õ&Ö'r8   c                ó0   € V ^8„  d   QhR\         R\         /# )r1   rË   Úupload_repore  )r5   s   "r6   r7   r7   ý  s   € ÷ 3Yñ 3Yœð 3Y¬#ñ 3Yr8   c           	     ó¶  € ^ RI HpHpHp ^RIHp VP                  ! 4        \        V 4      R,          pVP                  V4      pVP                  P                  pVe   RV RV RV RV R	2	p	MR
p	\        RV RV	 RV R24      Vn        VP                  V4       V! 4       p
V
P                  VRR7       V
P                  V VRR7       \!        RV R24       R# )z‘
Uploads the model to Hugging Face hub.

Args:
    path (str): Local path to the model.
    upload_repo (str): Name of the HF repo to upload to.
)ÚHfApir×  rû   )Ú__version__rÜ  Nz7
        This model was converted to MLX format from [`z`](https://huggingface.co/z")
        using mlx-vlm version **zF**.
        Refer to the [original model card](https://huggingface.co/z)) for more details on the model.
        rÛ  z
        # z	
        z‘
        ## Use with mlx

        ```bash
        pip install -U mlx-vlm
        ```

        ```bash
        python -m mlx_vlm.generate --model zp --max-tokens 100 --temperature 0.0 --prompt "Describe this image." --image <path_to_image>
        ```
        T)r  Úexist_okr«   )Úfolder_pathr  Ú	repo_typez0Upload successful, go to https://huggingface.co/z for details.)rÝ  rê  r×  rû   rÛ  rë  Úset_verbosity_infor   rl  rß  rã  r   r1  rä  Úcreate_repoÚupload_folderr¢  )rË   rè  rê  r×  rû   rë  Ú	card_pathrå  rÕ  Ú
provenanceÚapis   &&         r6   Úupload_to_hubrõ  ý  s  € ÷ :Ñ9åà×ÒÔ Ü�T“
˜[Õ(€IØ�>‰>˜)Ó$€Dà�i‰i×"Ñ"€GàÒð7Ø7>°iÐ?YÐZaÐYbð c!Ø!, ð .CØCJÀ)ð L	ð‰
ð ˆ
äðØˆ-ð 	Ø	ˆð ,ð -8¨=ð 9	ð	ó€D„Ið 	‡I�IˆiÔá
‹'€CØ‡O�O˜K°$€OÔ7Ø×ÑØØØð ô ô
 
Ð<¸[¸MÈÐ
WÖXr8   c                óP   € V ^8„  d   QhR\         P                  R\        R\        /# )r1   ÚlogitsÚgenerated_tokensÚpenalty)rI   rJ   r   rS   )r5   s   "r6   r7   r7   3  s%   € ÷ ñ ¤R§X¡Xð Äð Ìuñ r8   c                óê   € \        V4      ^ 8”  d^   \        P                  ! V Uu. uF  q3NK  	  up4      pV RV3,          p\        P                  ! V^ 8  WR,          WR,          4      pWPRV3&   V # u upi )a“  
Apply repetition penalty to specific logits based on the given context.

Paper: https://arxiv.org/abs/1909.05858

Args:
    logits (mx.array): The logits produced by the language model.
    generated_tokens (any): A list of N previous tokens.
    penalty (float): The repetition penalty factor to be applied.

Returns:
    logits (mx.array): Logits with repetition penalty applied to generated tokens.
ºNNN)r‡   rI   rJ   re   )r÷  rø  rù  ÚtokenÚindicesÚselected_logitss   &&&   r6   Úapply_repetition_penaltyrÿ  3  sy   € ô ÐÓ˜qÔ Ü—(’(Ñ/?Ó@Ñ/? ešEÑ/?Ñ@ÓAˆØ   G Õ,ˆÜŸ(š(Ø˜aÑ Õ!:¸OÕ<Uó
ˆð -ˆq�'ˆzÑØ€Mùò As   ¥
A0Údonate_weightsc                óv   € V ^8„  d   QhR\         \        \        3,          R\        P                  R\
        RR/# )r1   Ú	save_pathr«   r   rB   N)r   r~   r   r­   r®   rÌ   )r5   s   "r6   r7   r7   K  s=   € ÷ 6
ñ 6
Ü”Sœ$�YÕð6
ä�9‰9ð6
ô ð	6
ð
 
ñ6
r8   c               óú  € \        V \        4      '       d   \        V 4      p \        \	        VP                  4       4      4      pV P                  RRR7       \        V4      p\        V4      pV^8”  d   RMRp\        R VP                  4        4       4      pRRV/R/ /pV'       d+   VP                  \        R	 VP                  4       4      4       VP                  4        ?\        \        V4      4       Fw  p	WI,          p
R
WI&   VP                  V	^,           V4      pW,          p\         P"                  ! \        V4      V
RR/R7       V
P%                  4        F  pW¸R,          V&   K  	  ?
Ky  	  \'        VR,          4       Uu/ uF  qîVR,          V,          bK  	  upVR&   \)        V R,          R4      ;_uu_ 4       p\*        P,                  ! VV^R7       R
R
R
4       R
# u upi   + '       g   i     R
# ; i)z,Save model weights into specified directory.T)Úparentsrì  z"model-{:05d}-of-{:05d}.safetensorszmodel.safetensorsc              3   ó8   "  € T F  qP                   x € K  	  R # 5ir:   )rÍ  )r¡   rÒ  s   & r6   r¢   Úsave_weights.<locals>.<genexpr>a  s   é € Ð8Ñ'7 !—X–XÓ'7ùó   ‚r@  Ú
total_sizeÚ
weight_mapc                 ó.   € \         P                  ! . 4      # r:   rH   )rZ  s   &r6   Ú<lambda>Úsave_weights.<locals>.<lambda>g  s   € ¬¯ª°¬r8   Nr5   r   )r@  zmodel.safetensors.index.jsonÚw©Úindent)rD   r~   r   r4   r   rR  ÚmkdirrÓ  r‡   Úsumru  r<  r   ÚclearrR   r5   rI   Úsave_safetensorsr…   Úsortedro  rs  Údump)r  r«   r   r|   rÏ  Úshards_countÚshard_file_formatr  Ú
index_dataÚir›  Ú
shard_nameÚ
shard_pathÚweight_namerÑ  rW  s   &&$             r6   Úsave_weightsr  K  s½  € ô �)œS×!Ò!Ü˜“Oˆ	ä”< × 0Ñ 0Ó 2Ó3Ó4€Gà‡O�O˜D¨4€OÔ0ä˜Ó!€FÜ�v“;€Lð ˜!Ôñ 	-à ð ô Ñ8 w§~¡~Ô'7Ó8Ó8€JØ˜|¨ZÐ8¸,ÈÐK€J÷ Ø�‰”XÑ4°e×6FÑ6FÓ6HÓIÔJà‡M�M„OØä”3�v“;ÖˆØ•	ˆØˆ‰	Ø&×-Ñ-¨a°!­e°\ÓBˆ
ØÕ+ˆ
ä
×ÒœC 
›O¨U¸hÈÐ=NÕOà Ÿ:™:ž<ˆKØ4>�|Õ$ [Ó1ñ (âñ  ô 17°zÀ,Õ7OÔ0Pó Ù0P¨1ˆ:�lÕ# AÕ&Ò&Ñ0Pñ €Jˆ|Ñô 
ˆiÐ8Õ8¸#×	>Ô	>À!Ü�	Š	ØØØõ	
÷ 
?Ñ	>ùò	 ÷ 
?×	>Ð	>ús   ÆG$Ç G)Ç)G:	c                óV   € V ^8„  d   QhR\         R\        \        \        3,          RR/# )r1   r2   Úconfig_pathrB   N)r4   r   r~   r   )r5   s   "r6   r7   r7   „  s/   € ÷ )ñ )Üð)ä”sœD�yÕ!ð)ð 
ñ)r8   c                ó$  € V P                  RR4       V P                  RR4       \        \        V P                  4       4      4      p \	        VR4      ;_uu_ 4       p\
        P                  ! W^R7       RRR4       R#   + '       g   i     R# ; i)zùSave the model configuration to the ``config_path``.

The final configuration will be sorted before saving for better readability.

Args:
    config (dict): The model configuration.
    config_path (Union[str, Path]): Model configuration file path.
Ú_name_or_pathNÚtorch_dtyper  r  )rB  r4   r  rP  ro  rs  r  )r2   r  Úfids   && r6   Úsave_configr$  „  se   € ð ‡J�Jˆ Ô%Ø
‡J�Jˆ}˜dÔ#ô ”&˜Ÿ™›Ó(Ó)€Fô 
ˆk˜3×	Ô	 3Ü�	Š	�& aÕ(÷ 
 ×	×	Ò	ús   ÁA>Á>B	c                ó\   € V ^8„  d   QhR\         \        \        \        3,          R\        /# )r1   Úimage_sourceÚtimeout)r   r~   r   r   r¥   )r5   s   "r6   r7   r7   œ  s&   € ÷   ñ   œU¤3¬¬gÐ#5Õ6ð   Äñ   r8   c                óf  € ^ RI pT p \        V \        \        \        34      '       g"   \        R\        V 4      P                   24      h\        V \        4      '       dX   V P                  R4      '       dA   RV 9  d   \        R4      hV P                  R^4      w  rE\	        VP                  V4      4      p \        V \        4      '       dg   V P                  R4      '       dP   \        P                  ! V RVR7      ;_uu_ 4       pVP                  4        \	        VP                  4      p RRR4       \        P                   ! V 4      p\$        P&                  ! T4      pTP)                  R
4      #   + '       g   i     LM; i  \
         d    h \"         d   p\        RT R	T 24      ThRp?ii ; i)z]
Helper function to load an image from either a URL, file path, data URI,
or BytesIO object.
NzUnsupported image source type: zdata:image/rj  z1Invalid data URI format - missing comma separatorT©rŸ  r'  zFailed to load image from z: ÚRGB©zhttp://zhttps://)Úbase64rD   r~   r   r   r¸   r¤   Ú__name__Ú
startswithÚsplitÚ	b64decodeÚrequestsr™   Úraise_for_statusÚcontentr   ro  Ú	Exceptionr   Úexif_transposeÚconvert)	r&  r'  r,  Úoriginal_sourcerZ  rß  ÚresponseÚimager  s	   &&       r6   Ú
load_imager:  œ  sv  € ó
 à"€OðUÜ˜,¬¬d´GÐ(<×=Ò=ÜØ1´$°|Ó2D×2MÑ2MÐ1NÐOóð ô �l¤C×(Ò(¨\×-DÑ-DÀ]×-SÒ-SØ˜,Ô&Ü Ð!TÓUÐUØ"×(Ñ(¨¨aÓ0‰GˆAÜ" 6×#3Ñ#3°DÓ#9Ó:ˆLÜ�l¤C×(Ò(¨\×-DÑ-DØ#÷.
ò .
ô —’˜l°4À×IÕIÈXØ×)Ñ)Ô+Ü& x×'7Ñ'7Ó8�÷ Jô —
’
˜<Ó(ˆô ×#Ò# EÓ*€EØ�=‰=˜ÓÐ÷ J×Iûô
 ô ØÜô UÜÐ5°oÐ5FÀbÈÈÐLÓMÐSTÐTûðUús=   ˆA.F Á7BF Ä&E0Ä+F Å0F 	Å;F ÆF0ÆF0ÆF+Æ+F0c                 ó  € \        V^ ,          V P                  ,          V^,          V P                  ,          4      p\        V P                  V,          4      \        V P                  V,          4      3pV P	                  V4      # )r   )ÚminÚwidthÚheightr¥   Úresize)ÚimgÚmax_sizeÚratioÚnew_sizes   &&  r6   Úresize_imagerD  ¿  s]   € ä�˜•˜cŸi™iÕ'¨°!­°s·z±zÕ)AÓB€EÜ�C—I‘I Õ%Ó&¬¨C¯J©J¸Õ,>Ó(?Ð@€HØ�:‰:�hÓÐr8   c                 óú   € \        V \        4      '       d   \        V 4      p \        V R 4      '       d#   V P                  R8w  d   V P                  R4      p Ve"   \        V\        4      '       g   \        W4      p V # )r—   r*  )rD   r~   r:  rå   r—   r6  r   rD  )r@  Úresize_shaper“  s   &&&r6   Úprocess_imagerG  Æ  s`   € Ü�#”s×ÒÜ˜‹oˆÜˆs�F×Ò §¡¨EÔ 1Ø�k‰k˜%Ó ˆØÒ¬
°?ÔDV×(WÒ(WÜ˜3Ó-ˆØ€Jr8   c                ó$   € V ^8„  d   QhR\         /# rG   )Útuple)r5   s   "r6   r7   r7   Ð  s   € ÷ Nñ Nœñ Nr8   c                ó€
  € ^ RI p\        V \        4      '       d   VP                  V 4      p Rp\        V \        \
        34      '       d=   \        V 4      P                  P                  R4      P                  4       pVR,9   d   RpMk\        WP                  4      '       dQ   V P                  4       pV P                  ^4      pV P                  V4       VR,          R8X  g   VR,          R8X  d   RpV'       Ed+   ^ RIp^ RIp^ RIpVP                  R	4      p	VP                  R
4      p
V	f   \!        R4      h\        WP                  4      '       d#   V P                  ^ 4       V P                  4       pMRpV
'       d$   Ve    VP#                  V
RRRRRRRRR.
VRR7      pM0V
'       d'   VP#                  V
RRRRRRR\	        V 4      .	RR7      pMRpR^ríV'       dŠ   VP$                  ^ 8X  dy   VP'                  VP(                  4      pVP+                  R4      '       dG   VR,          ^ ,          p\-        VP+                  RR4      4      p\-        VP+                  R^4      4      pV	RR.pVe   VRR.,          pMVR\	        V 4      .,          pVRRRRR\	        V4      R .,          pVP#                  VVRR7      pVP$                  ^ 8w  d'   \!        R!VP.                  P1                  4        24      h\2        P4                  ! VP(                  \2        P6                  R"7      pEM¯^ RIp\        V \        \
        34      '       dM   VP;                  \	        V 4      4      pVP=                  \	        V 4      VP>                  VP@                  R#7      pMû\        WP                  4      '       dÊ   V P                  ^ 4       V P                  4       pVR,          R$8X  d   VPC                  V4      pM_VR%,          R&8X  g   VR',          R-9   d   VPE                  V4      pM1VR,          R(8X  d   VPG                  V4      pMVPI                  V4      pVP1                  VVP>                  VP@                  R#7      pM\K        R)\M        V 4       24      hVP@                  pVP>                  p\2        PN                  ! VPP                  \2        P6                  R"7      pV^8”  d   VPS                  R.V4      pVPU                  \2        PV                  4      R*,          pVPX                  ^8X  d   VR+\2        PZ                  3,          pVV3# )/z�Read an audio file using miniaudio (or ffmpeg for m4a/aac/ogg/opus).

Returns (samples_float32, sample_rate) where samples is always 2D (samples, channels).
NFrò   T:é   é   Ns   ftyp:NrK  Ns   OggSÚffmpegÚffprobez\ffmpeg not found. Install it: brew install ffmpeg (macOS) or sudo apt install ffmpeg (Linux)z-vÚquietz-print_formatrs  z-show_streamsz-select_streamsza:0z-izpipe:0)ÚinputÚcapture_output)rQ  iD¬  ÚstreamsÚsample_rateÚchannelsz-fÚs16lez-acodecÚ	pcm_s16lez-aczpipe:1zffmpeg decoding failed: rP   )Ú	nchannelsrS  s   RIFF:Né   Ns   ID3:Nr1   Ns   fLaCzUnsupported file type: g      à@rû  )Úm4aÚaacÚoggÚopus)s   ÿûs   ÿúéÿÿÿÿ).ÚiorD   Úbytesr   r~   r   ÚsuffixÚlstriprõ   Útellrr  rx  rs  ÚshutilÚ
subprocessÚwhichrm  ÚrunÚ
returncodert  Ústdoutr™   r¥   ÚstderrÚdecoder  Ú
frombufferÚint16Ú	miniaudioÚget_file_infoÚdecode_filerW  rS  Úwav_get_infoÚmp3_get_infoÚflac_get_infoÚvorbis_get_infoÚ	TypeErrorr¤   rJ   ÚsamplesÚreshapera   rU   ÚndimÚnewaxis)ÚfileÚ_ioÚ
use_ffmpegÚextÚposr~  Ú_jsonrc  rd  Úffmpeg_pathÚffprobe_pathÚ
input_dataÚproberS  rW  ÚinforŸ  ÚcmdÚresultru  rm  r�   rß  r5  s   &                       r6   Ú
read_audior†  Ð  sŠ  € ó
 ä�$œ×ÒØ�{‰{˜4Ó ˆð €JÜ�$œœd˜×$Ò$Ü�4‹j×Ñ×&Ñ& sÓ+×1Ñ1Ó3ˆØÐ/Ô/ØˆJøÜ	�DŸ+™+×	&Ò	&Ø�i‰i‹kˆØ—‘˜2“ˆØ�	‰	�#ŒØ�#�;˜'Ô! V¨B¥Z°7Ô%:ØˆJç€zÛÛÛà—l‘l 8Ó,ˆØ—|‘| IÓ.ˆØÒÜð5óð ô
 �dŸK™K×(Ò(Ø�I‰I�aŒLØŸ™›‰JàˆJ÷ ˜JÒ2Ø—N‘Nà ØØØ#ØØ#Ø%ØØØðð !Ø#ð #ó ‰E÷  Ø—N‘Nà ØØØ#ØØ#Ø%ØÜ˜“Ið
ð  $ð #ó ‰Eð ˆEà!&¨�Yß�U×%Ñ%¨Ô*Ø—;‘;˜uŸ|™|Ó,ˆDØ�x‰x˜	×"Ò"Ø˜i�¨Õ+�Ü! &§*¡*¨]¸EÓ"BÓC�Ü §
¡
¨:°qÓ 9Ó:�	ð ˜D 'Ð*ˆØÒ!Ø�D˜(Ð#Õ#‰Cà�Dœ#˜d›)Ð$Õ$ˆCØ��g˜y¨+°u¼cÀ)»nÈhÐWÕWˆà—‘ ¨:Àd�ÓKˆØ×Ñ Ô!ÜÐ!9¸&¿-¹-×:NÑ:NÓ:PÐ9QÐRÓSÐSä—-’- §¡´R·X±XÔ>Šãä�dœS¤$˜K×(Ò(Ø×*Ñ*¬3¨t«9Ó5ˆDØ×+Ñ+Ü�D“	ØŸ.™.Ø ×,Ñ,ð ,ó ‰Gô
 ˜Ÿk™k×*Ò*Ø�I‰I�aŒLØ—9‘9“;ˆDà�B�x˜7Ô"Ø ×-Ñ-¨dÓ3‘Ø�b•˜VÔ# t¨B¥xÐ3MÔ'MØ ×-Ñ-¨dÓ3‘Ø�b•˜WÔ$Ø ×.Ñ.¨tÓ4‘à ×0Ñ0°Ó6�Ø×&Ñ&ØØŸ.™.Ø ×,Ñ,ð 'ó ‰Gô Ð5´d¸4³j°\ÐBÓCÐCà×)Ñ)ˆØ×%Ñ%ˆ	Ü—(’(˜7Ÿ?™?´"·(±(Ô;ˆð �1„}Ø—/‘/ " iÓ0ˆØ�N‰Nœ2Ÿ:™:Ó&¨Õ0€Eð ‡z�z�Q„Ø�aœŸ™�mÕ$ˆà�+ÐÐr8   c                ó0   € V ^8„  d   QhR\         R\         /# )r1   Úsrr'  )r¥   )r5   s   "r6   r7   r7   a  s   € ÷  ;ñ  ;äð ;ô ñ ;r8   c                ó,  € \        V \        P                  4      '       dG   V P                  \        P                  RR7      pVP
                  ^8”  d   VP                  ^R7      # T# ^ RIHp ^ RI	H
p \        V \        4      '       d   \        V 4      p \        V \        4      '       db   V P                  R4      '       dK    \        P                  ! V RVR7      pVP!                  4        V! \#        VP$                  4      RR	7      w  r7MV! V RR	7      w  r7Wq8w  d
   V! W7V4      p\        P*                  ! V\        P                  R	7      pVP
                  ^8”  d   VP                  ^R7      # T#   \&         d   p\)        R
T  RT 24      ThRp?ii ; i)zM
Helper function to load audio from either a URL, file path, or numpy array.
F)Úcopy©Úaxis)rr  )Úresample_audioTr)  rU   rP   zFailed to load audio from URL: z with error Nr+  )rD   r  Úndarrayra   rU   rw  ÚmeanÚmlx_audio.audio_iorr  Úmlx_audio.utilsr�  r   r~   r.  r1  r™   r2  r   r3  r4  r¸   Úasarray)	ry  rˆ  r'  r5  r†  r�  r8  rS  r  s	   &&&      r6   Ú
load_audior“  a  sK  € ô �$œŸ
™
×#Ò#Ø—‘œBŸJ™J¨U�Ó3ˆØ%*§Z¡Z°!¤^ˆu�z‰z˜qˆzÓ!Ð>¸Ð>å5Ý.ä�$œ×ÒÜ�4‹yˆÜ�$œ×Ò §¡Ð1H×!IÒ!Ið	Ü—|’| D°¸wÔGˆHØ×%Ñ%Ô'Ù!+¬G°H×4DÑ4DÓ,EÈYÔ!WÑˆE�;ñ (¨°IÔ>ÑˆàÔÙ˜u°2Ó6ˆÜ�JŠJ�u¤B§J¡JÔ/€EØ!&§¡¨a¤ˆ5�:‰:˜1ˆ:ÓÐ:°UÐ:øô ô 	ÜØ1°$°°|ÀAÀ3ÐGóàðûð	ús   ÃAE1 Å1FÅ<FÆFc                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r1   ÚfeaturesrB   rH   )r5   s   "r6   r7   r7   „  s&   € ÷ Fñ F¤r§x¡xð F´B·H±Hñ Fr8   c                ó€   € V \         P                  ! V 4      ,
          \         P                  ! V 4      R,           ,          # )zGNormalize mel spectrogram features for lossy audio formats (e.g., MP3).ç�íµ ÷Æ°>)rI   r�  Ústd)r•  s   &r6   Únormalize_audio_featuresr™  „  s)   € à”r—w’w˜xÓ(Õ(¬R¯VªV°HÓ-=ÀÕ-DÕEÐEr8   c                ó¸   € V ^8„  d   QhR\         R\        R\        \        ,          R\        R\        R\        R\        \
        P                  \        3,          /# )r1   Ú
video_pathÚfpsÚnframesÚ
min_framesÚ
max_framesÚframe_factorrB   )r~   rS   r	   r¥   r
   r  rŽ  )r5   s   "r6   r7   r7   ‰  s`   € ÷ > ñ > Üð> ä	ð> ô ”c�]ð> ô ð	> ô
 ð> ô ð> ô Œ2�:‰:”uÐÕñ> r8   c           	     ó¶  a€ ^ RI pV P                  R4      '       d
   V R,          p VP                  V 4      pVP                  4       '       g   \	        RV  24      h\        VP                  VP                  4      4      pVP                  VP                  4      ;'       g    Rp	V3R lp
V3R lpV3R lpVe
   V
! V4      pMEV! V4      pV! \        WH4      4      pW‰,          V,          p\        \        WÞ4      Wø4      pV! V4      pSTu;8:  d   V8:  g(   M VP                  4        \	        R	S R
V RV R24      h\        P                  ! ^ V^,
          V4      P                  4       P                  \
        4      p. pV Fg  pVP!                  VP"                  V4       VP%                  4       w  ppV'       g    M/VP'                  VP)                  VVP*                  4      4       Ki  	  VP                  4        V'       g   \	        R4      h\        P,                  ! \        P.                  ! V^ R7      R4      pV\        VR4      ,          V	,          pVV3# )uÑ   Read a video file as a (T, C, H, W) numpy array.

Uniformly samples ``nframes`` frames â€” either a fixed count or derived
from ``fps`` â€” and returns the sampled frames alongside the effective
sampling fps.
Nzfile://:é   NNzCannot open video: rO   c                 ó6   <€ \        V S,          4      S,          # r:   )Úround©Únr   s   &€r6   Ú_roundÚload_video.<locals>._round¢  s   ø€ Ü�Q˜Õ%Ó&¨Õ5Ð5r8   c                 óL   <€ \         P                  ! V S,          4      S,          # r:   )Úmathrf   r¥  s   &€r6   Ú_floorÚload_video.<locals>._floor¥  s   ø€ Ü�zŠz˜!˜lÕ*Ó+¨lÕ:Ð:r8   c                 óL   <€ \         P                  ! V S,          4      S,          # r:   )rª  Úceilr¥  s   &€r6   Ú_ceilÚload_video.<locals>._ceil¨  s   ø€ Ü�yŠy˜˜\Õ)Ó*¨\Õ9Ð9r8   znframes must be in [r´   z], got rò   zNo frames read from the video.r‹  r—  )r   rX  é   r1   )Úcv2r.  ÚVideoCaptureÚisOpenedr¸   r¥   r™   ÚCAP_PROP_FRAME_COUNTÚCAP_PROP_FPSr<  ÚmaxÚreleaser  Úlinspacer¤  ra   ÚsetÚCAP_PROP_POS_FRAMESrr  rT   ÚcvtColorÚCOLOR_BGR2RGBÚ	transposeÚstack)r›  rœ  r�  rž  rŸ  r   r²  ÚcapÚtotal_framesÚ	video_fpsr§  r«  r¯  r¦  ÚloÚhirý  ÚframesÚidxÚretÚframeÚvideo_npÚ
sample_fpss   &&&&&f                 r6   Ú
load_videorË  ‰  s÷  ø€ ó à×Ñ˜Y×'Ò'Ø •^ˆ
à
×
Ñ
˜:Ó
&€CØ�<‰<�>Š>ÜÐ.¨z¨lÐ;Ó<Ð<Ü�s—w‘w˜s×7Ñ7Ó8Ó9€LØ—‘˜×(Ñ(Ó)×0Ð0¨S€Iõ6õ;õ:ð ÒÙ�7‹O‰á�:ÓˆÙ”C˜
Ó1Ó2ˆØÕ$ sÕ*ˆÜ”�A“
˜BÓ-ˆÙ�1‹IˆØ˜AÖ- Ö-Ø�‰ŒÜØ" < .°°<°.ÀÈÀsÈ!ÐLó
ð 	
ô �kŠk˜!˜\¨AÕ-¨qÓ1×7Ñ7Ó9×@Ñ@ÄÓE€GØ€FÛˆØ�‰�×'Ñ'¨Ô-Ø—X‘X“Z‰
ˆˆUßÙØ�‰�c—l‘l 5¨#×*;Ñ*;Ó<Ö=ñ ð ‡K�K„MßÜÐ9Ó:Ð:ä�|Š|œBŸHšH V°!Ô4°lÓC€HØ”S˜ tÓ,Õ,¨yÕ8€JØ�ZÐÐr8   c                 óÌ  € \        V R V 4      p	\        P                  ! V	4      P                  p
RVRVRVRV/pRV
9   d   WkR&   RV
9   d   WKR&   V
P	                  4        F-  pWÈP	                  4       9   g   K  VP                  VR4      W¼&   K/  	  VeL   \        V4      ^ 8”  d<   RV
9   d   W;R&   M/R	V
9   d   W;R	&   M#\        R
V P                  P                   R24      hV	! R/ VB # )Úprocessr1  ÚimagesÚpaddingÚreturn_tensorsÚpadding_sideÚadd_special_tokensNr5  Úaudiosz
Processor z! does not support audio parameterrÏ   )
rM  r¶  r·  rR  r…   r™   r‡   r¸   Ú	__class__r-  )r”  ÚpromptsrÎ  r5  rÒ  rÏ  rÑ  rÐ  rS  Úprocess_methodrR  ÚargsÚparams   &&&&&&&&,    r6   Úprocess_inputsrÙ  Ê  s   € ô ˜Y¨	°9Ó=€NÜ×"Ò" >Ó2×=Ñ=€Jð 	�Ø�&Ø�7Ø˜.ð	€Dð ˜Ô#Ø+ˆ^Ñð ˜zÔ)Ø%7Ð!Ñ"à—‘Ö"ˆØ—K‘K“MÖ!Ø Ÿ*™* U¨DÓ1ˆD‹Kñ #ð
 ÒœS ›Z¨!œ^Ø�jÔ Ø!�ŠMØ˜Ô#Ø"�ŠNäØ˜Y×0Ñ0×9Ñ9Ð:Ð:[Ð\óð ñ Ñ!˜DÑ!Ð!r8   c                 ór   €  \        V 3R VRVRVRVRV/VB #   \         d   p\        RT 24      hRp?ii ; i)rÕ  rÎ  r5  rÒ  rÐ  z%Failed to process inputs with error: N)rÙ  r4  r¸   )r”  rÕ  rÎ  r5  rÒ  rÐ  rS  r  s   &&&&&&, r6   Úprocess_inputs_with_fallbackrÛ  ù  sy   € ðFÜØñ
àð
ð ð
ð ð	
ð
  2ð
ð *ð
ð ñ
ð 	
øô ô FÜÐ@ÀÀÐDÓEÐEûðFús   ‚ ˜6£1±6c                 ó
  a<€ VR J;'       d(    \        VR4      '       * ;'       g    \        V4      ^ 8„  pVR J;'       d(    \        VR4      '       * ;'       g    \        V4      ^ 8„  pVR J;'       d(    \        VR4      '       * ;'       g    \        V4      ^ 8„  pV'       Eg   V'       Eg   V'       Eg   \        V R4      '       d   V P                  MT pV'       d    VP                  f   VP                  Vn        V! VVVV	VR7      p\        VP                  \        P                  4      '       d   VP                  M\        P                  ! VP                  4      p\        VP                  \        P                  4      '       d   VP                  M\        P                  ! VP                  4      pRVRV/# VEeY   \        V\        4      '       g   V.p\        V R4      '       d   V P                  MR pV Uu. uF  p\        VVV4      NK  	  pp\        V4      ^8”  Edó   V
'       Edê   R pVe�   \        VR4      '       d{   VP                  p\        V\        4      '       d   TpMU\        V\        4      '       d&   VP!                  RR	4      VP!                  R
R	4      3pM\        V\"        4      '       d   VV3pVe{   . pV Fo  pVP                  V^,          V^ ,          38w  d;   VP%                  V^,          V^ ,          3\&        P(                  P*                  4      pVP-                  V4       Kq  	  TpMÙ\/        R V 4       4      p\/        R V 4       4      p. pV F«  pVP0                  V8w  g   VP2                  V8w  dv   \&        P4                  ! RVV3R04      pVVP0                  ,
          ^,          pVVP2                  ,
          ^,          pVP7                  VVV34       VP-                  V4       Kš  VP-                  V4       K­  	  TpR pR p Rp!\        V R4      '       d   V P8                  P:                  MRp"RV"P=                  4       9   d   RV"P=                  4       9   d   Rp!Rp#VEe�   \        V4      ^ 8”  Ed   \        V\        4      '       g   V.pRR0o<\>        ;QJ d    V<3R lV 4       F  '       g   K   RM	  RM! V<3R lV 4       4      p#\        V4      ^8”  d   \A        R4       VR,          pV!'       dÀ   V U$u. uF$  p$\C        V$V PD                  PF                  R7      NK&  	  p%p$V% U&u. uF"  p&V&PI                  \J        PL                  4      NK$  	  p%p&\O        V RR 4      p'V'f   \Q        R4      hV'! V%V'PF                  RRR7      p\J        PR                  ! VR,          R1\J        PT                  R7      p M<\O        V RR 4      p'V'e   \O        V'RR4      MRp(V U$u. uF  p$\C        V$V(R7      NK  	  pp$R p)V'       d–   \        V\        4      '       g   V.pVPW                  R R!4      p*. . p)p+V F^  p,\        V,\X        \Z        34      '       d   \]        \Y        V,4      V*R"7      MV,V*3w  p-p.V+P-                  V-4       V)P-                  V.4       K`  	  T+p/ p/\        V R4      '       Edß   \        V P                  \^        4      '       Ed¾   \        V\        4      '       g   V.pV P                  f   V P                  V n        V U0U1u. uF4  p0V0Pa                  R#4       U1u. uF  p1V ! V14      P                  NK  	  up1NK6  	  p2p0p1\/        R$ V2 4       4      p3. pV2 Fr  p4V4^ ,          V.,           V4^,          ,           p5V Pb                  .V3\        V54      ,
          ,          pVP-                  \        P                  ! V5V,           4      4       Kt  	  \        P                  ! V4      V/R&   V P                  Pe                  VR%7      p6\        P                  ! \J        Pf                  ! V64      4      V/R&&   \        P                  ! V U5u. uF  p5V5V Pb                  8g  NK  	  up54      PI                  \        PT                  4      V/R&   EMC\        V R4      '       d>   V P                  P                  f&   V P                  P                  V P                  n        / p7V'       d   VV7R'&   V)e   V)V7R &   \i        V 3R(VR)VR*VR+V/V7BVB pR(V9   d   VR(,          VR&&   VPW                  R(4       RV9   d   \        P                  ! VR,          4      MR V/R&   VPk                  4        Fe  w  p8p9V8V/9  g   K  V9f   V9V/V8&   K  \        V9\X        \        \        P                  34      '       d   V9V/V8&   KL  \        P                  ! V94      V/V8&   Kg  	  Ve‡   \        P                  ! VR,,          4      V/R,&   \        P                  ! VR,          4      PI                  \        PT                  4      V/R-&   \        P                  ! V \        PT                  R.7      V/R/&   V#'       di   R,V/9   db   V/R,,          p:\        V:\        4      '       d5   V: U;u. uF"  p;\m        \        P                  ! V;4      4      NK$  	  up;V/R,&   V/# \m        V:4      V/R,&   V/# u upi u up$i u up&i u up$i u up1i u up1p0i u up5i u up;i )2NÚ__len__r½  )rÒ  rÏ  rÑ  rÐ  Ú	input_idsÚattention_maskr“  ræ   r>  i€  r=  c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir:   )r=  ©r¡   r@  s   & r6   r¢   Ú!prepare_inputs.<locals>.<genexpr>m  s   é € Ð<±V¨c§	¦	³Vùr  c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir:   )r>  rá  s   & r6   r¢   râ  n  s   é € Ð >±v°§¦³vùr  r*  FrÔ  rÛ  Úqwen3ÚomniTz.mp3z.m4ac              3   ó†   <"  € T F6  p\        V4      P                  4       P                  \        S4      4      x € K8  	  R # 5ir:   )r~   rõ   r†   rI  )r¡   rW  Úlossy_extensionss   & €r6   r¢   râ  ’  s2   øé € ð 
ÙFKÀŒC�‹F�L‰L‹N×#Ñ#¤EÐ*:Ó$;×<Ð<Ãeùs   ƒ>Azl[33mWarning[0m: Single prompt with multiple audio files is not supported yet. Using the first audio file.
:Nr±  N)rˆ  Úfeature_extractorz3Processor missing feature_extractor for audio prep.)Úsampling_raterÏ  Úreturn_attention_mask)rŒ  rQ   ré  i€>  rœ  rM   )rœ  z<image>c              3   óT   "  € T F  p\        R  V 4       4      ^,           x € K   	  R# 5i)c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir:   )r‡   )r¡   Úchunks   & r6   r¢   Ú+prepare_inputs.<locals>.<genexpr>.<genexpr>Ý  s   é € Ð/©˜u”�E—
�
«ùr  N)r  )r¡   Úchunkss   & r6   r¢   râ  Ü  s&   é € ð 
ÙBM¸ŒCÑ/©Ó/Ó/°!×3Ò3Ã+ùs   ‚&()rÎ  Úpixel_valuesÚvideosrÎ  r5  rÕ  rÒ  Úinput_featuresÚfeature_attention_maskrP   Úaudio_feature_lengths)éÿ   rõ  rõ  r]  )7rå   r‡   r½  Ú	pad_tokenÚ	eos_tokenrD   rÞ  rI   rJ   rß  r„   r“  rG  ræ   rI  r4   r™   r¥   r?  r   Ú
ResamplingÚBICUBICrT   r·  r=  r>  ÚnewÚpasterÔ  r-  rõ   r¦   r¢  r“  rè  ré  ra   r  rU   rM  r¸   r  rd   rB  r~   r_  rË  r   r/  Úpad_token_idÚ
preprocessr¿  rÛ  rP  r™  )=r”  rÎ  r5  rñ  rÕ  Úimage_token_indexrF  rÒ  rÏ  rÑ  Úpad_to_uniform_sizerÐ  rS  Ú
has_imagesÚ	has_audioÚ
has_videosr½  ÚinputsrÞ  Úmaskr“  r@  Útarget_sizeræ   Úresized_imagesÚ	max_widthÚ
max_heightÚpadded_imagesÚ
padded_imgÚx_offsetÚy_offsetÚaudio_inputsrô  Úis_qwen3_omni_moeÚprocessor_class_nameÚis_lossy_audioÚ
audio_fileÚaudio_arraysÚaudio_arrayrè  rˆ  rÂ  Úfps_hintÚloadedrÒ  ÚarrÚs_fpsÚmodel_inputsÚpromptrí  Útext_chunksÚ
max_lengthrï  Úidsrð  Úextrar>   r[   rW  r^   rç  s=   &&&&&&&&&&&&,                                               @r6   Úprepare_inputsr    sO
  ø€ ð  ˜tÐ#÷ ð Ü�F˜IÓ&Ô&×9Ð9¬#¨f«+¸©/ð ð ˜TÐ!×WÐW¬7°5¸)Ó+DÔ'D×'VÐ'VÌÈEË
ÐUVÉ€IØ˜tÐ#÷ ð Ü�F˜IÓ&Ô&×9Ð9¬#¨f«+¸©/ð ÷ ˆ:Ÿi˜i·
°
ä#*¨9°k×#BÒ#BˆI×ÒÈ	ð 	÷ �y×*Ñ*Ò2Ø"+×"5Ñ"5ˆIÔÙØØ1ØØ%Ø)ô
ˆô ˜&×*Ñ*¬B¯H©H×5Ò5ð ×Òä—’˜&×*Ñ*Ó+ð 	ô ˜&×/Ñ/´·±×:Ò:ð ×!Ò!ä—’˜&×/Ñ/Ó0ð 	ð ˜Ø˜dð
ð 	
ð ÓÜ˜&¤$×'Ò'Ø�XˆFô *1°Ð<M×)NÒ)NˆI×%Ò%ÐTXð 	ñ PVÓVÉvÈ”-  \°?ÖCÉvˆÐVô
 ˆv‹;˜�?×2Ð2àˆKØÒ*¬w°È×/OÒ/OØ&×+Ñ+�Ü˜d¤E×*Ò*Ø"&‘KÜ ¤d×+Ò+Ø#'§8¡8¨H°cÓ#:¸D¿H¹HÀWÈcÓ<RÐ"S‘KÜ ¤c×*Ò*Ø#'¨ ,�KàÒ&à!#�Û!�CØ—x‘xØ# A�Ø# A�ð$ô ð "Ÿj™jØ(¨�^¨[¸­^Ð<¼e×>NÑ>N×>VÑ>Vó˜ð #×)Ñ)¨#Ö.ñ "ð (‘ô  Ñ<±VÓ<Ó<�	Ü Ñ >±vÓ >Ó>�
à "�Û!�CØ—y‘y IÔ-°·±¸zÔ1IÜ%*§Y¢YØ! I¨zÐ#:¸Oó&˜
ð %.°·	±	Õ$9¸aÕ#?˜Ø$.°·±Õ$;ÀÕ#A˜Ø"×(Ñ(¨¨x¸Ð.BÔCØ%×,Ñ,¨ZÖ8à%×,Ñ,¨SÖ1ñ "ð '�ð €LØ ÐØÐä(/°	¸;×(GÒ(Gˆ	×Ñ×$Ò$ÈRð ð 	Ð'×-Ñ-Ó/Ô/ØÐ*×0Ñ0Ó2Ô2à Ðà€NØÓœS ›Z¨!�^Ü˜%¤×&Ò&Ø�GˆEð # FÐ+Ðß›ô 
ÙFKó
ŸŸšô 
ÙFKó
ó 
ˆô ˆu‹:˜Œ>Üð Fôð ˜"•IˆEçñ #(óá"'�Jô ˜:¨)×*EÑ*E×*SÑ*S×TÙ"'ð ð ñ
 COóÙBN°;�×"Ñ"¤2§:¡:Ö.Á,ð ð ô !(¨	Ð3FÈÓ MÐØ Ò(Ü Ð!VÓWÐWá,ØØ/×=Ñ=ØØ&*ô	ˆLô %'§F¢FØÐ-Õ.°R¼r¿x¹xô%Ñ!ô !(¨	Ð3FÈÓ MÐð %Ò0ô Ð)¨?¸EÔBàð ñ
 FKÓKÁU°z”Z 
¨r×2ÁUˆEÐKà€IßÜ˜&¤$×'Ò'Ø�XˆFØ—:‘:˜e SÓ)ˆØ �	ˆÛˆAô ˜a¤#¤u ×.Ò.ô œ3˜q›6 xÕ0à˜�]ñ ˆC�ð
 �M‰M˜#ÔØ×Ñ˜UÖ#ñ ð ˆà€LäˆyÐ+×,Ó,´Ø×!Ñ!Ô#5÷2ó 2ô ˜'¤4×(Ò(Ø�iˆGà×ÑÒ&Ø"+×"5Ñ"5ˆIÔñ "ô
á!�ð 6<·\±\À)Ô5LÓMÑ5L¨E‰Y�uÓ×'Ô'Ñ5LÔMÙ!ð 	ñ 
ô ñ 
ÙBMó
ó 
ˆ
ð
 ˆ	Û!ˆFØ˜•)Ð0Ð1Õ1°F¸1µIÕ=ˆCØ ×-Ñ-Ð.°*¼sÀ3»xÕ2GÕHˆGØ×ÑœRŸXšX c¨G¥mÓ4Ö5ñ "ô
 %'§H¢H¨YÓ$7ˆ�[Ñ!Ø ×0Ñ0×;Ñ;À6Ð;ÓJˆÜ')§x¢x´·²¸Ó0FÓ'Gˆ�^Ñ$Ü)+¯ªÙ8AÓB¹	°ˆc�Y×+Ñ+Ô+¹	ÑBó*
ç
‰&”—‘Ó
ð 	Ð%Ó&ô
 �9˜k×*Ò*¨y×/BÑ/B×/LÑ/LÒ/TØ,5×,?Ñ,?×,IÑ,IˆI×ÑÔ)àˆßØ$ˆE�(‰OØÒ$Ø(��e‘Ü-Øñ
àð
ð ð
ð ð	
ð
  2ð
ð ð
ð ñ
ˆð �vÔØ%+¨HÕ%5ˆF�>Ñ"Ø�J‰J�xÔ ð 3CÀfÔ2LŒB�HŠH�VÐ,Õ-Ô.ÐRVð 	Ð%Ñ&ð
 !Ÿ,™,ž.‰JˆC�Ø˜,Ö&Ø’=Ø(-�L Ó%Ü ¬¬T´2·8±8Ð'<×=Ò=Ø(-�L Ó%ä(*¯ª°«�L Ó%ñ )ð ÒÜ)+¯ª°,Ð?OÕ2PÓ)QˆÐ%Ñ&Ü13·²ØÐ)Õ*ó2
ç
‰&”—‘Ó
ð 	Ð-Ñ.ô 13·²Ø!¬¯©ô1
ˆÐ,Ñ-÷ Ð*¨lÔ:ØÐ)Õ*ˆÜ�aœ×Òá?@ó.Ù?@¸!Ô(¬¯ª°!«Ö5¹qñ.ˆLÐ)Ñ*ð Ðô .FÀaÓ-HˆLÐ)Ñ*àÐùòq Wùò`ùòùò2 Lùò: Nùó
ùò* Cùòh.s<   Ç>kÔ*k!Õ(k&×3k+Ük5Ü5k0Ýk5ák;ê(l ë0k5c                óP  € V ^8„  d   QhR\         \        P                  ,          R\        R\        \        \        \
        \
        3,          \         \        P                  ,          3,          \        \        \
        \
        3,          \         \
        ,          3,          3,          /# )r1   rÎ  Údisable_groupingrB   )r   r   rÌ   r
   r   r¥   )r5   s   "r6   r7   r7   (  sk   € ÷ 1+ñ 1+Ü”—‘Õð1+äð1+ô Œ4””cœ3�h•¤¤e§k¡kÕ!2Ð2Õ3´T¼%ÄÄSÀ½/Ì4ÔPSÍ9Ð:TÕ5UÐUÕVñ1+r8   c                óœ  € V'       dW   / p/ p\        V 4       F@  w  rEVP                  VP                  3pVP                  VP                  V3pV.W'&   V.W7&   KB  	  W#3# / p/ p\        V 4       FY  w  rEVP                  VP                  3pWb9  d	   . W&&   . W6&   W&,          P                  V4       W6,          P                  V4       K[  	  W#3# )aý  
Group images by their dimensions for efficient batch processing.

Images with the same dimensions can be stacked and processed together,
which is much faster than processing individually (especially on GPU).

Args:
    images: List of PIL images to group
    disable_grouping: If True, each image gets its own group (useful for debugging)

Returns:
    grouped_images: Dict mapping shape -> list of images with that shape
    grouped_indices: Dict mapping shape -> list of original indices

Example:
    >>> images = [img_400x300, img_800x600, img_400x300_2]
    >>> grouped, indices = group_images_by_shape(images)
    >>> grouped
    {(300, 400): [img_400x300, img_400x300_2], (600, 800): [img_800x600]}
    >>> indices
    {(300, 400): [0, 2], (600, 800): [1]}
)Ú	enumerater>  r=  rT   )rÎ  r   Úgrouped_imagesÚgrouped_indicesr  r@  r»   Úunique_shapes   &&      r6   Úgroup_images_by_shaper&  (  s×   € ÷4 àˆØˆÜ Ö'‰FˆAØ—Z‘Z §¡Ð+ˆEàŸJ™J¨¯	©	°1Ð5ˆLØ,/¨5ˆNÑ(Ø-.¨CˆOÓ)ñ (ð Ð.Ð.à?A€NØ8:€Oä˜FÖ#‰ˆØ—‘˜SŸY™YÐ'ˆØÔ&Ø$&ˆNÑ!Ø%'ˆOÑ"ØÕ×$Ñ$ SÔ)ØÕ×%Ñ% aÖ(ñ $ð Ð*Ð*r8   c                   ót   a € ] tR tRt o RV 3R lR lltRV 3R lR lltRV 3R lR lltV 3R	 lR
 ltRtV t	R# )rÀ  i\  Nc                ó0   <€ V ^8„  d   QhRS[ S[,          /# ©r1   r�  ©r   r¥   )r5   Ú__classdict__s   "€r6   r7   ÚStoppingCriteria.__annotate__]  s   ø€ ÷ #ñ #¡d©3¥iñ #r8   c                ó\   € \        V\        4      '       d
   V.V n        MWn        W n        R # r:   )rD   r¥   r�  r½  )Úselfr�  r½  s   &&&r6   r¸  ÚStoppingCriteria.__init__]  s$   € ä�m¤S×)Ò)Ø"/ ˆDÕà!.Ôà"Žr8   c                óF   <€ V ^8„  d   QhRS[ S[S[S[,          3,          /# )r1   Únew_eos_token_ids)r   r¥   r   )r5   r+  s   "€r6   r7   r,  f  s!   ø€ ÷ 0ñ 0±5¹¹dÁ3½i¸Õ3Hñ 0r8   c                óÐ  € Vf   R# V P                   f   \        R4      hVeÃ   \        V\        \        34      '       d   V.p. pV F~  p\        V\        4      '       d   VP                  V4       K,  \        V\        4      '       g   KD  VP                  V P                   P                  RV,           RR7      R,          4       K€  	  V P                  P                  V4       R# R# )zû
Add new token IDs to the list of EOS token IDs.

Args:
    new_eos_token_ids: Integer, string, or list of integers/strings representing token IDs to add.
                       If strings are provided, they will be converted to integers if possible.
NzProcessor is not providedÚ F©rÒ  r]  )	r½  r¸   rD   r~   r¥   rT   rw  r�  Úextend)r.  r1  Úresolvedrü  s   &&  r6   Úadd_eos_token_idsÚ"StoppingCriteria.add_eos_token_idsf  sÁ   € ð Ò$Ùà�>‰>Ò!ÜÐ8Ó9Ð9àÒ(ÜÐ+¬c´3¨Z×8Ò8Ø%6Ð$7Ð!ØˆHÛ*�Ü˜e¤S×)Ò)Ø—O‘O EÖ*Ü ¤s×+Ô+Ø—O‘OØŸ™×-Ñ-¨c°E­kÈeÐ-ÓTÐUWÕXöñ	 +ð ×Ñ×%Ñ% hÖ/ñ )r8   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r)  r*  )r5   r+  s   "€r6   r7   r,  �  s   ø€ ÷ 	/ñ 	/¡4©¥9ñ 	/r8   c                ó¢   € Ve   TMV P                   P                  p\        V\        4      '       d   V.pV P                  V8w  d	   Wn        R # R # r:   )r½  r�  rD   r¥   )r.  r�  s   &&r6   ÚresetÚStoppingCriteria.reset�  sJ   € à*Ò6‰M¸D¿N¹N×<XÑ<Xð 	ô �m¤S×)Ò)Ø*˜OˆMà×Ñ Ô.Ø!.Öñ /r8   c                ó:   <€ V ^8„  d   QhRS[ P                  RS[/# )r1   rÞ  rB   )rI   rJ   rÌ   )r5   r+  s   "€r6   r7   r,  Œ  s   ø€ ÷ /ñ /¡"§(¡(ð /©tñ /r8   c                ó   € WP                   9   # r:   rœ  )r.  rÞ  s   &&r6   Ú__call__ÚStoppingCriteria.__call__Œ  s   € Ø×.Ñ.Ñ.Ð.r8   )r�  r½  r:   )
r-  Ú
__module__Ú__qualname__Ú__firstlineno__r¸  r7  r;  r?  Ú__static_attributes__Ú__classdictcell__©r+  s   @r6   rÀ  rÀ  \  s-   ø‡ € ÷#ò #÷0ò 0÷6	/ò 	/÷/ö /r8   rÀ  c                   ód   a € ] tR tRt o RtRV 3R lR lltR tV 3R lR ltV 3R	 lR
 ltRt	V t
R# )ÚThinkingBudgetCriteriai�  z¹
Enforces a budget on thinking tokens.

Tracks tokens within thinking blocks (between start and end tokens) and
forces a closing sequence (e.g. ``\n</think>``) when budget is exceeded.
Nc                óB   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[/# )r1   Úthinking_budgetÚthinking_end_tokenÚthinking_start_tokenÚenable_thinking)r¥   r~   r	   rÌ   )r5   r+  s   "€r6   r7   Ú#ThinkingBudgetCriteria.__annotate__˜  s9   ø€ ÷ $ñ $ñ ð$ñ  ð	$ñ
 '¡s�mð$ñ ñ$r8   c                óÒ  € Wn         W n        WPn        VP                  VR R7      R,          V n        VP                  VR R7      R,          V n        . V n        VP                  RR R7      pV'       d#   V P                  P                  VR,          4       V P                  P                  V P                  4       ^ V n        V P                  V n	        ^ V n
        R V n        RV n        R# )Fr4  Ú
Nr]  )r½  rJ  rM  rw  Úthinking_end_token_idÚthinking_start_token_idÚ_forced_sequencerT   Ú_forced_indexÚin_thinkingÚthinking_token_countÚbudget_exceededÚforced_token_id)r.  r½  rJ  rK  rL  rM  Únewline_idss   &&&&&& r6   r¸  ÚThinkingBudgetCriteria.__init__˜  så   € ð #ŒØ.ÔØ.Ôð &/×%5Ñ%5Ø°5ð &6ó &
à
õ&ˆÔ"ð (1×'7Ñ'7Ø °Uð (8ó (
à
õ(ˆÔ$ð ,.ˆÔØ×&Ñ& tÀÐ&ÓFˆßØ×!Ñ!×(Ñ(¨°R­Ô9Ø×Ñ×$Ñ$ T×%?Ñ%?Ô@ØˆÔà×/Ñ/ˆÔØ$%ˆÔ!Ø$ˆÔØ#ˆÖr8   c                óR   € V P                   V n        ^ V n        RV n        ^ V n        R# )z)Reset thinking state between generations.FN)rM  rU  rV  rW  rT  )r.  s   &r6   Úreset_thinking_stateÚ+ThinkingBudgetCriteria.reset_thinking_state¹  s(   € à×/Ñ/ˆÔØ$%ˆÔ!Ø$ˆÔØˆÖr8   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# )r1   Útoken_idrB   )r¥   r	   )r5   r+  s   "€r6   r7   rN  À  s   ø€ ÷ ñ ¡ð ©±#­ñ r8   c                ó:  € V P                   '       d   WP                  8X  d
   RV n        R# WP                  8X  d   RV n        RV n        ^ V n        R# V P                  '       d<   V ;P                  ^,          un        V P                  V P                  8”  d   RV n        V P                  '       dc   V P
                  \        V P                  4      8  d?   V P                  V P
                  ,          pV ;P
                  ^,          un        W n
        V# RV n
        R# )zKProcess a token and return a forced token ID if budget exceeded, else None.TNF)rM  rR  rU  rQ  rW  rT  rV  rJ  r‡   rS  rX  )r.  r_  Úforceds   && r6   r?  ÚThinkingBudgetCriteria.__call__À  så   € à××Ð H×0LÑ0LÔ$LØ#ˆDÔÙà×1Ñ1Ô1Ø$ˆDÔØ#(ˆDÔ Ø!"ˆDÔÙà××ÐØ×%Ò%¨Õ*Õ%Ø×(Ñ(¨4×+?Ñ+?Ô?Ø'+�Ô$à××Ð D×$6Ñ$6¼¸T×=RÑ=RÓ9SÔ$SØ×*Ñ*¨4×+=Ñ+=Õ>ˆFØ×Ò !Õ#ÕØ#)Ô ØˆMà#ˆÔÙr8   c                ó^   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          /# )r1   Únext_yrB   )rI   rJ   r	   )r5   r+  s   "€r6   r7   rN  Ú  s(   ø€ ÷ ñ ©¯©ð ±h¹r¿x¹xÕ6Hñ r8   c                óš   € V P                   e=   V P                  '       d+   \        P                  ! V P                   .4      pR V n         V# V# r:   )rX  rM  rI   rJ   )r.  rd  s   &&r6   Úapply_forced_tokenÚ)ThinkingBudgetCriteria.apply_forced_tokenÚ  sB   € Ø×ÑÒ+°×0D×0DÐ0DÜ—X’X˜t×3Ñ3Ð4Ó5ˆFØ#'ˆDÔ ØˆMØˆr8   )rT  rS  rW  rM  rX  rU  rJ  rQ  rR  rV  r½  )z</think>NF)r-  rA  rB  rC  Ú__doc__r¸  r\  r?  rf  rD  rE  rF  s   @r6   rH  rH  �  s.   ø‡ € ñ÷$ò $òB÷ð ÷4ö r8   rH  c                óf   € V ^8„  d   QhR\         P                  R\        \        ,          R\        /# )r1   ÚtÚlabelrB   )rI   rJ   r	   r~   r4   )r5   s   "r6   r7   r7   â  s)   € ÷ "ñ "œ"Ÿ(™(ð "¬8´C­=ð "¼Tñ "r8   c                ó   € \         P                  ! V 4      p\         P                  ! V 4      p\         P                  ! V 4      p\         P                  ! V 4      pR\        V P                  4       R\        V P                  4      R\        V 4      RRV RV P                   R2RRV RV P                   R2R	RV RV P                   R2R
RV RV P                   R2RV'       d   TMR/p\        R4       VP                  4        F;  w  rxVR8X  d   \        RV RV R24       K   \        RV R\        V4       R24       K=  	  \        R4       V# )zÒ
Return a dictionary report of an MLX array similar to PyTorch's tensor representation.
Args:
    arr: MLX array to analyze
Returns:
    Dictionary containing shape, dtype, value representation, and statistics
r»   rQ   r[   r�  zarray(z, dtype=Ú)r˜  r<  r·  rk  rJ   Ú{z 'z': rj  Ú})rI   r�  r˜  r<  r·  rI  r»   r~   rQ   Úreprr¢  rP  )	rj  rk  Úmean_valÚstd_valÚmin_valÚmax_valÚreportr>   r[   s	   &&       r6   Úprint_array_reportrv  â  s2  € ô �wŠw�q‹z€HÜ�fŠf�Q‹i€GÜ�fŠf�Q‹i€GÜ�fŠf�Q‹i€Gð 	”E˜!Ÿ'™'“NÐ#Ø”�Q—W‘W“Ø”�a“Ø�&˜˜
 (¨1¯7©7¨)°1Ð5Ø�˜�y ¨¯©¨	°Ð3Ø�˜�y ¨¯©¨	°Ð3Ø�˜�y ¨¯©¨	°Ð3ØŸ%‘ Wð	€Fô 
ˆ#„JØ—l‘l–n‰
ˆØ�'Œ>Ü�B�s�e˜3˜u˜g QÐ'Ö(ä�B�s�e˜3œt E›{˜m¨1Ð-Ö.ñ	 %ô
 
ˆ#„JØ€Mr8   )Úfloat16Úbfloat16rU   )r�  ÚtemperatureÚtop_pÚtop_kÚ	do_sample)FNN)NFN)Fr:   )NFNT)NN)TN)é
   )rM   NrK  i   r1   )NNFTÚleftr   )Fr   )NNNNNNFTr~  Fr   )cr:  r÷   r¶  rs  rû   rª  rp  r^  r   Úpathlibr   Útextwrapr   Útypingr   r   r   r	   r
   r   Úmlx.coreÚcorerI   Úmlx.nnr­   Únumpyr  r1  r>  rÝ  r   Ú	mlx.utilsr   r   ÚPILr   r   Útransformersr   Útransformers.processing_utilsr   Úmodels.baser   Útokenizer_utilsr   Útrainer.utilsr   r·   rö   ÚMAX_FILE_SIZE_GBÚMODEL_CONVERSION_DTYPESrn  r;   r?   rE   r\   rˆ   ry   r�   r›   r©   rÈ   rÝ   rà   rë   r  r  rú   r  ra  r=  rG  rE  rl  r©  r9  r‘  r’  rÉ  rÓ  ræ  rõ  rÿ  r  r$  r:  rD  rG  r†  r“  r™  rË  rÙ  rÛ  r  r&  rÀ  rH  rv  rÏ   r8   r6   Ú<module>r�     sn  ðÛ Û Û Û Û Û Û Ý Ý Ý ß :× :å Ý Û Û Û Ý -ß ,ß Ý &Ý 8å +Ý +Ý ,ð ")¨'Ð 2Ð ðØ�9ðà�=ðð �=ðð ˆyð	ð
 �lðð ˆJðð �=ðð �&ðð �Hðð Ð&ðð Ð(ðð Ð(ðð ˆxðð Ð,ðð 'Ð(>ðð  �-ð!€ð& Ð â<Ð à(¨$Ð/Ð ð"Ð õõ1õ-ñ0 &Ó'Ð õ*!õZ3õl+Sõ\!õHõ8@õ0?ôõ*&õR-õ
÷$÷NMõ`)ôXò÷,6÷r2õj#NõL÷<÷B$ð 8H÷ ÷0(õ:3Yõlð06
ð !÷	6
õr)÷0  òF òõN÷b ;õFF÷
> ôB,"ô^Fô0T÷n1+÷h1/ñ 1/÷hOñ O÷d"r8   