ó
    ‡Ž¡j"R  ã                   ó  • S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SSKrSSKJrJr  S	S
KJr  SSKJrJrJrJr  \
(       a
  SSKJrJrJr  \R4                  " \5      rSr " S S5      r " S S5      rg)z3
Model loading, caching, and lifecycle management.
é    N)ÚCallable)Ú	lru_cache)ÚTYPE_CHECKING)Úscan_cache_dir)Útqdm)ÚBitsAndBytesConfigÚPreTrainedTokenizerBaseé   )Úloggingé   )ÚModalityÚmake_progress_tqdm_classÚreset_torch_cacheÚsplit_model_id)ÚPreTrainedModelÚPreTrainedTokenizerFastÚProcessorMixinz transformers-community/ggml-attnc            	       óX   • \ rS rSrSr  SSSS\SSS	S
4S jjrSS jrSS jrSS jr	Sr
g)Ú
TimedModelé.   aL  Wraps a model + processor and auto-unloads them after a period of inactivity.

Args:
    model: The loaded model.
    timeout_seconds: Seconds of inactivity before auto-unload. Use -1 to disable.
    processor: The associated processor or tokenizer.
    on_unload: Optional callback invoked after the model is unloaded from memory.
NÚmodelr   Útimeout_secondsÚ	processorú/ProcessorMixin | PreTrainedTokenizerFast | NoneÚ	on_unloadzCallable | Nonec                 óü   • Xl         [        UR                  5      U l        X0l        X l        X@l        [        R                  " U R
                  U R                  5      U l
        U R                  R                  5         g ©N)r   ÚstrÚname_or_pathÚ_name_or_pathr   r   Ú
_on_unloadÚ	threadingÚTimerÚ_timeout_reachedÚ_timerÚstart)Úselfr   r   r   r   s        Ú´C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/cli/serving/model_manager.pyÚ__init__ÚTimedModel.__init__8   sZ   € ð Œ
Ü  ×!3Ñ!3Ó4ˆÔØ"ŒØ.ÔØ#ŒÜ—o’o d×&:Ñ&:¸D×<QÑ<QÓRˆŒØ�‰×ÑÕó    c                 óÌ   • U R                   R                  5         [        R                  " U R                  U R
                  5      U l         U R                   R                  5         g)z4Reset the inactivity timer (called on each request).N)r%   Úcancelr"   r#   r   r$   r&   ©r'   s    r(   Úreset_timerÚTimedModel.reset_timerG   s@   € à�‰×ÑÔÜ—o’o d×&:Ñ&:¸D×<QÑ<QÓRˆŒØ�‰×ÑÕr+   c                 ó  • [        U S5      (       ax  U R                  bj  U ?U ?SU l        SU l        [        R                  " 5         [        5         U R                  R                  5         U R                  b  U R                  5         gggg)z0Delete the model and processor, free GPU memory.r   N)	Úhasattrr   r   ÚgcÚcollectr   r%   r-   r!   r.   s    r(   Údelete_modelÚTimedModel.delete_modelM   sp   € ä�4˜×!Ñ! d§j¡jÑ&<Ø�
Ø�ØˆDŒJØ!ˆDŒNÜ�JŠJŒLÜÔØ�K‰K×ÑÔ Ø�‰Ñ*Ø—‘Õ!ð +ð '=Ð!r+   c                 ó¤   • U R                   S:”  a@  U R                  5         [        R                  U R                   SU R                    S35        g g )Nr   z was removed from memory after zs of inactivity)r   r5   ÚloggerÚinfor    r.   s    r(   r$   ÚTimedModel._timeout_reachedZ   sJ   € Ø×Ñ !Ó#Ø×ÑÔÜ�K‰K˜4×-Ñ-Ð.Ð.MÈd×NbÑNbÐMcÐcrÐsÕtð $r+   )r    r!   r%   r   r   r   )NN©ÚreturnN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úintr)   r/   r5   r$   Ú__static_attributes__© r+   r(   r   r   .   sM   † ñð HLØ'+ñà ðð ðð Eð	ð
 %õôô"÷ur+   r   c                   óø  • \ rS rSrSr       S&S\S\S-  S\S\S-  S\S-  S	\S
\S-  4S jjr\	S\S-  4S j5       r
\S\S-  S\\-  S\S-  4S j5       rS r\	S\S\4S j5       rS\S-  4S jr S'S\S\S-  SS4S jjr   S(S\S\S-  S\S-  S\S-  SS4
S jjr   S(S\S\S-  S\S-  S\S-  SS4
S jjrS\4S jrS)S jr\	 S'SSS S!S\4S" jj5       r\	\S'S#\S-  S\\   4S$ jj5       5       rS%rg)*ÚModelManageré`   a™  Loads, caches, and manages the lifecycle of models.

Handlers receive a reference to this and call `load_model_and_processor()`
to get a model ready for inference.

Args:
    device: Device to place models on (e.g. "auto", "cuda", "cpu").
    dtype: Torch dtype override. "auto" derives from model weights.
    trust_remote_code: Whether to trust remote code when loading models.
    attn_implementation: Attention implementation override (e.g. "flash_attention_2").
    quantization: Quantization method ("bnb-4bit" or "bnb-8bit").
    model_timeout: Seconds before an idle model is unloaded. -1 disables.
    force_model: If set, preload this model at init time.
NÚdeviceÚdtypeÚtrust_remote_codeÚattn_implementationÚquantizationÚmodel_timeoutÚforce_modelc                 óî  • 0 U l         0 U l        [        R                  " 5       U l        0 U l        0 U l        UR                  5       (       a  [        U5      OUU l	        U R                  U5      U l        X0l        U R                  X@R                  5      U l        XPl        X`l        Xpl        U R%                  5         Ub  SU l        Ub-  ['        U5      u  p‰U R)                  U R+                  U5      U	S9  g g )Néÿÿÿÿ©Ú	gguf_file)Úloaded_modelsÚ_model_locksr"   ÚLockÚ_model_locks_guardÚ_loading_subscribersÚ_loading_tasksÚisdigitrB   rH   Ú_resolve_dtyperI   rJ   Ú_resolve_attn_implementationrK   rL   rM   rN   Ú_validate_argsr   Úload_model_and_processorÚprocess_model_name)
r'   rH   rI   rJ   rK   rL   rM   rN   ÚreporR   s
             r(   r)   ÚModelManager.__init__p   sì   € ð 57ˆÔð 8:ˆÔÜ"+§.¢.Ó"2ˆÔð QSˆÔ!Ø79ˆÔð &,§^¡^×%5Ñ%5”c˜&”k¸6ˆŒØ×(Ñ(¨Ó/ˆŒ
Ø!2ÔØ#'×#DÑ#DÐEX×ZeÑZeÓ#fˆÔ Ø(ÔØ*ÔØ&Ôà×ÑÔð Ñ"Ø!#ˆDÔð Ñ"Ü,¨[Ó9‰OˆDØ×)Ñ)¨$×*AÑ*AÀ$Ó*GÐS\Ð)Ò]ð #r+   c                 óˆ   • SS K nU S;   a  U $ [        XS 5      n[        X!R                  5      (       d  [	        SU  S35      eU$ )Nr   )ÚautoNzUnsupported dtype: 'zF'. Must be 'auto' or a valid torch dtype (e.g. 'float16', 'bfloat16').)ÚtorchÚgetattrÚ
isinstancerI   Ú
ValueError)rI   rc   Úresolveds      r(   rZ   ÚModelManager._resolve_dtype˜   sN   € ãà�NÓ"ØˆLÜ˜5¨Ó.ˆÜ˜(§K¡K×0Ñ0ÜØ& u gÐ-sÐtóð ð ˆr+   r<   c                 óš  • Ub  U$ SSK nSSKJn  [        U[        5      =(       a    UR                  S5      =(       dV    US:H  =(       aJ    UR                  R                  R                  5       =(       a    UR                  R                  5       (       + nU(       a/  U" 5       (       a#  [        R                  S[         S35        [        $ U$ )	z4
Default to a fast kernel for `mps` when available.
Nr   r
   )Úis_kernels_availableÚmpsrb   zBMPS detected and `kernels` is installed: defaulting attention to `z0`. Pass `--attn-implementation sdpa` to opt out.)rc   Úutils.import_utilsrj   re   r   Ú
startswithÚbackendsrk   Úis_availableÚcudar8   Úwarning_onceÚ	GGML_ATTN)ÚclsrK   rH   rc   rj   Úis_mps_devices         r(   r[   Ú)ModelManager._resolve_attn_implementation¥   sµ   € ð
 Ñ*Ø&Ð&ãå>ô �vœsÓ#÷ )Ø×!Ñ! %Ó(÷jà˜&Ñ ×h U§^¡^×%7Ñ%7×%DÑ%DÓ%F×hÈuÏzÉz×OfÑOfÓOhÔKhð 	ö
 Ñ1×3Ñ3Ü×ÑØTÔU^ÐT_ð `@ð @ôô ÐØ"Ð"r+   c                 ó(  • U R                   b)  U R                   S;  a  [        SU R                    S35      eSSKJn  1 SknU R                  bE  U" U R                  5      (       d-  U R                  U;  a  [        SU R                   SU S	35      eg g g )
N)úbnb-4bitúbnb-8bitz"Unsupported quantization method: 'z$'. Must be 'bnb-4bit' or 'bnb-8bit'.r
   )Ú	is_kernel>   ÚsdpaÚeagerÚflex_attentionÚflash_attention_2Úflash_attention_3z'Unsupported attention implementation: 'z'. Must be one of z8 or a hub kernel (e.g. 'kernels-community/flash-attn2').)rL   rf   Úintegrations.hub_kernelsry   rK   )r'   ry   ÚVALID_ATTN_IMPLEMENTATIONSs      r(   r\   ÚModelManager._validate_args¾   s´   € Ø×ÑÑ(¨T×->Ñ->ÐF^Ó-^ÜØ4°T×5FÑ5FÐ4GÐGkÐlóð õ 	:â%rÐ"à×$Ñ$Ñ0Ù˜d×6Ñ6×7Ñ7Ø×(Ñ(Ð0JÓJäØ9¸$×:RÑ:RÐ9Sð T"Ø"<Ð!=Ð=uðwóð ð Kð 8ð 1r+   Úmodel_idc                 ó   • SU ;   a  U $ U  S3$ )zBCanonicalize to `'model_id@revision'` format. Defaults to `@main`.Ú@z@mainrD   )r‚   s    r(   r^   ÚModelManager.process_model_nameÐ   s   € ð �(‹?ØˆOØ�˜5Ð!Ð!r+   c                 ól   • U R                   S:X  a  [        SSSS9$ U R                   S:X  a	  [        SS9$ g)zIReturn a BitsAndBytesConfig based on the `quantization` setting, or None.rw   TÚnf4)Úload_in_4bitÚbnb_4bit_quant_typeÚbnb_4bit_use_double_quantrx   )Úload_in_8bitN)rL   r   r.   s    r(   Úget_quantization_configÚ$ModelManager.get_quantization_config×   sD   € à×Ñ 
Ó*Ü%Ø!Ø$)Ø*.ñð ð
 ×Ñ *Ó,Ü%°4Ñ8Ð8Ør+   Úmodel_id_and_revisionrR   z(ProcessorMixin | PreTrainedTokenizerFastc                 ó¨   • SSK JnJn  UR                  SS5      u  pVUb  UR	                  XRX`R
                  S9$ UR	                  XVU R
                  S9$ )ztLoad a processor for the given model.

Args:
    model_id_and_revision: Model ID in ``'model_id@revision'`` format.
r   )ÚAutoProcessorÚAutoTokenizerr„   r   )rR   ÚrevisionrJ   )r’   rJ   )Útransformersr�   r‘   ÚsplitÚfrom_pretrainedrJ   )r'   rŽ   rR   r�   r‘   r‚   r’   s          r(   Ú_load_processorÚModelManager._load_processorã   sd   € ÷ 	>à2×8Ñ8¸¸aÓ@ÑˆØÑ à ×0Ñ0Ø¸×TjÑTjð 1ð ð ð ×,Ñ,¨XÐ\`×\rÑ\rÐ,ÐsÐsr+   Ú
tqdm_classÚprogress_callbackr   c                 óÖ  • SSK Jn  UR                  SS5      u  pgUU R                  U R                  U R
                  U R                  US.nU R                  5       n	U	b  X˜S'   Ub  XHS'   Ub  U" SUS	S
.5        UR                  " U40 UD6n
SSK	J
n  U
R                  U;   a  SSK Jn  UR                  " U40 UD6$ [        [         U
R                  S   5      nUR                  " U40 UD6$ )aK  Load a model.

Args:
    model_id_and_revision (`str`): Model ID in ``'model_id@revision'`` format.
    tqdm_class (*optional*): tqdm subclass for progress bars during ``from_pretrained``.
    progress_callback (`Callable`, *optional*): Called with progress dicts during loading.

Returns:
    `PreTrainedModel`: The loaded model.
r   )Ú
AutoConfigr„   r   )r’   rK   rI   Ú
device_maprJ   r˜   Úquantization_configrR   ÚloadingÚconfig©Ústatusr   Ústage)Ú%MODEL_FOR_MULTIMODAL_LM_MAPPING_NAMES)ÚAutoModelForMultimodalLM)r“   r›   r”   rK   rI   rH   rJ   rŒ   r•   Ú&transformers.models.auto.modeling_autor£   Ú
model_typer¤   rd   Úarchitectures)r'   rŽ   r˜   r™   rR   r›   r‚   r’   Úmodel_kwargsr�   rŸ   r£   r¤   Úarchitectures                 r(   Ú_load_modelÚModelManager._load_modelõ   sý   € õ" 	,à2×8Ñ8¸¸aÓ@Ñˆð !Ø#'×#;Ñ#;Ø—Z‘ZØŸ+™+Ø!%×!7Ñ!7Ø$ñ
ˆð #×:Ñ:Ó<ÐØÑ*Ø2EÐ.Ñ/àÑ Ø(1˜Ñ%àÑ(Ù¨Ð=RÐ]eÑfÔgØ×+Ò+¨HÑE¸ÑEˆå`à×ÑÐ EÓEÝ=à+×;Ò;¸HÑUÈÑUÐUäœ|¨V×-AÑ-AÀ!Ñ-DÓEˆØ×+Ò+¨HÑE¸ÑEÐEr+   z@tuple[PreTrainedModel, ProcessorMixin | PreTrainedTokenizerFast]c           	      óì  ^ • Uc  UOU SU 3nT R                      T R                  R                  U[        R                  " 5       5      nSSS5        W   UT R
                  ;  a‚  [        R                  SU 35        Ub  U" SUSS.5        T R                  XS9nT R                  UUUUS9n[        UT R                  UU4U 4S	 jjS
9T R
                  U'   Ub  U" SUSS.5        O^T R
                  U   R                  5         T R
                  U   R                  nT R
                  U   R                  nUb  U" SUSS.5        SSS5        X‡4$ ! , (       d  f       GN= f! , (       d  f       WW4$ = f)at  Load a model (or return it from cache), resetting its inactivity timer.

Args:
    model_id_and_revision: Model ID in ``'model_id@revision'`` format.
    progress_callback: If provided, called with dicts like
        ``{"status": "loading", "model": ..., "stage": ...}`` during loading.
    tqdm_class: Optional tqdm subclass for progress bars during ``from_pretrained``.
NÚ:zLoading rž   r   r    rQ   )r˜   r™   rR   c                 ó<   >• TR                   R                  U S 5      $ r   )rS   Úpop)Úcachedr'   s    €r(   Ú<lambda>Ú7ModelManager.load_model_and_processor.<locals>.<lambda>M  s   ø€ °×1CÑ1C×1GÑ1GÈÐPTÔ1Ur+   )r   r   r   ÚreadyF©r¡   r   r°   T)rV   rT   Ú
setdefaultr"   rU   rS   r8   Úwarningr–   rª   r   rM   r/   r   r   )	r'   rŽ   r™   r˜   rR   ÚkeyÚlockr   r   s	   `        r(   r]   Ú%ModelManager.load_model_and_processor'  sŽ  ø€ ð  (1Ñ'8Ñ#ÐAVÐ@WÐWXÐYbÐXcÐ>dˆð ×$Ó$Ø×$Ñ$×/Ñ/°´Y·^²^Ó5EÓFˆD÷ %ò Ø˜$×,Ñ,Ó,Ü—‘ ¨#¨Ð/Ô0Ø$Ñ0Ù%°ÀSÐS^Ñ&_Ô`Ø ×0Ñ0Ð1FÐ0Ð\�	Ø×(Ñ(Ø)Ø)Ø&7Ø'ð	 )ð �ô +5ØØ$(×$6Ñ$6Ø'Ø,/ÖUñ	+�×"Ñ" 3Ñ'ð %Ñ0Ù%°À3ÐRWÑ&XÔYøà×"Ñ" 3Ñ'×3Ñ3Ô5Ø×*Ñ*¨3Ñ/×5Ñ5�Ø ×.Ñ.¨sÑ3×=Ñ=�	Ø$Ñ0Ù%°À3ÐRVÑ&WÔX÷3 ð4 ÐÐ÷; %Ö$ú÷ ŒTð4 �iÐÐús   š0EÁC1E"Å
EÅ"
E3c                óÌ  ^ ^^^^^	#   • Um[         R                  " 5       nTT R                  ;   a?  T R                  T   R                  5         S[        R
                  " STSS.5       S37v •  gTT R                  ;   aC  T R                  T   R                  U5         UR                  5       I Sh  v•N nUc   gU7v •  M$  U/T R                  T'   [         R                  " 5       mS[        4UUU 4S jjm[        TT5      m	U	4S	 jmUUUUU U	4S
 jn[         R                  " U" 5       5      T R                  T'    UR                  5       I Sh  v•N nUc  gU7v •  M#   N® N7f)a�  Load a model and stream progress as SSE events.

Handles three cases:
1. Model already cached -> single ``ready`` event
2. Load already in progress -> join existing subscriber stream
3. First request -> start loading, broadcast to all subscribers

Args:
    model_id_and_revision (`str`): Model ID in ``'model_id@revision'`` format.

Yields:
    `str`: SSE ``data: ...`` lines with progress updates.
údata: r³   Tr´   ú

NÚpayloadc                 ón   >^• S[         R                  " U 5       S3mUUU4S jnTR                  U5        g )Nr»   r¼   c                  ón   >• TR                   R                  T/ 5       H  n U R                  T5        M     g r   )rW   ÚgetÚ
put_nowait)ÚqÚmidÚmsgr'   s    €€€r(   Ú	broadcastÚEModelManager.load_model_streaming.<locals>.enqueue.<locals>.broadcast�  s-   ø€ Ø×2Ñ2×6Ñ6°s¸BÖ?�AØ—L‘L Ö%ò @r+   )ÚjsonÚdumpsÚcall_soon_threadsafe)r½   rÅ   rÄ   ÚlooprÃ   r'   s     @€€€r(   ÚenqueueÚ2ModelManager.load_model_streaming.<locals>.enqueue~  s0   ù€ Øœ4Ÿ:š: gÓ.Ð/¨tÐ4ˆC÷&ð ×%Ñ% iÕ0r+   c                 ó   >• T" U0 UD6$ r   rD   )ÚfactoryÚargsÚkwargsr˜   s      €r(   Ú
_tqdm_hookÚ5ModelManager.load_model_streaming.<locals>._tqdm_hook‰  s   ø€ Ù˜tÐ. vÑ.Ð.r+   c               “   óì  >#   •  [         R                  " T5      n  [        R                  " TR                  TTTS9I S h  v•N   [         R                  " U 5        UU4S jnTR                  U5        g  N3! [         R                  " U 5        f = f! [
         a9  n[        R                  ST SU 3SS9  T" ST[        U5      S.5         S nANtS nAff = f! UU4S jnTR                  U5        f = f7f)	N)r™   r˜   zFailed to load z: T)Úexc_infoÚerror)r¡   r   Úmessagec                  ó¦   >• TR                   R                  T/ 5       H  n U R                  S 5        M     TR                  R                  TS 5        g r   )rW   r¯   rÁ   rX   )rÂ   rÃ   r'   s    €€r(   Ú_send_sentinelÚKModelManager.load_model_streaming.<locals>.run_load.<locals>._send_sentinel   sC   ø€ Ø!×6Ñ6×:Ñ:¸3ÀÖC˜ØŸ™ TÖ*ñ Dà×'Ñ'×+Ñ+¨C°Õ6r+   )
r   Úset_tqdm_hookÚasyncioÚ	to_threadr]   Ú	Exceptionr8   rÕ   r   rÉ   )	Úprevious_hookÚerØ   rÑ   rË   rÊ   rÃ   r'   r˜   s	      €€€€€€r(   Úrun_loadÚ3ModelManager.load_model_streaming.<locals>.run_loadŒ  sá   øé € ð:ô !(× 5Ò 5°jÓ A�ð9Ü!×+Ò+Ø×5Ñ5ØØ*1Ø#-ñ	÷ ð ô ×)Ò)¨-Ô8ö7ð
 ×)Ñ)¨.Õ9ñ%øô ×)Ò)¨-Õ8ûÜó NÜ—‘˜¨s¨e°2°a°SÐ9ÀD�ÑIÙ 7°SÄSÈÃVÑL×MÑMûðNûö
7ð
 ×)Ñ)¨.Õ9üsc   ƒC4…B œ$A6 Á A4ÁA6 ÁB ÁC4Á4A6 Á6BÂB Â
CÂ/CÃ
C ÃCÃC ÃC1Ã1C4)rÛ   ÚQueuerS   r/   rÇ   rÈ   rX   rW   ÚappendrÀ   Úget_running_loopÚdictr   Úcreate_task)
r'   rŽ   ÚqueueÚitemrà   rÑ   rË   rÊ   rÃ   r˜   s
   `    @@@@@r(   Úload_model_streamingÚ!ModelManager.load_model_streamingY  sS  ýé € ð $ˆÜ+2¯=ª=«?ˆð �$×$Ñ$Ó$Ø×Ñ˜sÑ#×/Ñ/Ô1Øœ4Ÿ:š:°À3ÐRVÑ&WÓXÐYÐY]Ð^Ó^Øð �$×%Ñ%Ó%Ø×%Ñ% cÑ*×1Ñ1°%Ô8ØØ"ŸY™Y›[×(�Ø‘<Øàð “
ñ	 ð +0¨ˆ×!Ñ! #Ñ&Ü×'Ò'Ó)ˆð	1œT÷ 	1ñ 	1ô .¨g°sÓ;ˆ
õ	/÷	:ò 	:ô6 $+×#6Ò#6±x³zÓ#Bˆ×Ñ˜CÑ àØŸ™›×$ˆDØ‰|ØØ‹Jñ	 ñk )ñl %ùs%   ˆB)E$Â1E Â2BE$ÅE"ÅE$Å"E$c                 óx   • [        U R                  R                  5       5       H  nUR                  5         M     g)z,Delete all loaded models and free resources.N)ÚlistrS   Úvaluesr5   )r'   Útimeds     r(   ÚshutdownÚModelManager.shutdown¯  s,   € ä˜$×,Ñ,×3Ñ3Ó5Ö6ˆEØ×ÑÖ ò 7r+   r   r   r   c                 ó€  • Ub%  [        U[        5      (       a  [        R                  $ SSKJnJnJn  U R                  R                  nXTR                  5       ;   a  [        R                  $ XSR                  5       ;   a  [        R                  $ XRR                  5       ;   a  [        R                  $ [        SU 35      e)aˆ  Detect whether a model is an LLM or VLM based on its architecture.

Args:
    model (`PreTrainedModel`): The loaded model.
    processor (`ProcessorMixin | PreTrainedTokenizerFast`, *optional*):
        If a plain tokenizer (not a multi-modal processor), short-circuits to LLM.

Returns:
    `Modality`: The detected modality (``Modality.LLM``, ``Modality.VLM``, or ``Modality.MULTIMODAL``).
r   ©Ú!MODEL_FOR_CAUSAL_LM_MAPPING_NAMESÚ*MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMESr£   zUnknown modality for: )re   r	   r   ÚLLMr¥   ró   rô   r£   Ú	__class__r=   rí   Ú
MULTIMODALÚVLMrf   )r   r   ró   rô   r£   Úmodel_classnames         r(   Úget_model_modalityÚModelManager.get_model_modality´  s�   € ð Ñ ¤Z°	Ô;R×%SÑ%SÜ—<‘<Ð÷	
ñ 	
ð  Ÿ/™/×2Ñ2ˆØ×JÑJÓLÓLÜ×&Ñ&Ð&Ø× QÑ QÓ SÓSÜ—<‘<ÐØ× HÑ HÓ JÓJÜ—<‘<ÐäÐ5°oÐ5FÐGÓHÐHr+   Ú	cache_dirc           	      ón  ^^^• SSK JnJnJn  / n[        R                  S5        [        [        U 5      R                  5       GHm  nUR                  S:w  a  M  UR                  R                  5        GH8  u  pg[        S UR                   5       S5      nU(       d  M,  [        R                  " UR!                  5       R#                  5       5      n	[%        U	[&        5      (       a  SU	;   d  M{  U	S   n
UR)                  5       mUR)                  5       mUR)                  5       m[+        UUU4S jU
 5       5      (       d  MÎ  S	UR,                  ;   a  UR,                  R/                  S	5      S   OS
nUR,                  US:w  a  SU 3OS
-   nUR1                  UUSUR2                  S.5        GM;     GMp     U$ )a.  List generative models (LLMs and VLMs) available in the HuggingFace cache.

Args:
    cache_dir (`str`, *optional*): Path to the HuggingFace cache directory.
        Defaults to the standard cache location.

Returns:
    `list[dict]`: OpenAI-compatible model list entries with ``id``, ``object``, etc.
r   rò   z/Scanning the cache directory for LLMs and VLMs.r   c              3   ó\   #   • U  H"  oR                   S :X  d  M  UR                  v •  M$     g7f)zconfig.jsonN)Ú	file_nameÚ	file_path)Ú.0Úfs     r(   Ú	<genexpr>Ú.ModelManager.get_gen_models.<locals>.<genexpr>ï  s$   é € Ð#mÒ9L°A×P[ÑP[Ð_lÑPl£K A§K¦KÒ9Lùs   ‚,™,Nr§   c              3   óB   >#   • U  H  o/ TQTQTQ;   d  M  Uv •  M     g 7fr   rD   )r  ÚarchÚllmsÚ
multimodalÚvlmss     €€€r(   r  r  ü  s)   øé € Ð]ª ÐA\À4ÐA\È$ÐA\ÐQ[ÐA\Ñ9\—t‘tªùs   ƒ–	Ú/Ú Úmainr„   )Úowned_byÚidÚobjectÚcreated)r¥   ró   rô   r£   r8   r¶   r   r   ÚreposÚ	repo_typeÚrefsÚitemsÚnextÚfilesrÇ   ÚloadsÚopenÚreadre   rå   rí   ÚanyÚrepo_idr”   rã   Úlast_modified)rü   ró   rô   r£   Úgenerative_modelsr_   ÚrefÚrevision_infoÚconfig_pathrŸ   r§   ÚauthorÚrepo_handler  r  r	  s                @@@r(   Úget_gen_modelsÚModelManager.get_gen_modelsÕ  so  ú€ ÷	
ñ 	
ð ÐÜ�‰ÐHÔIäœ¨	Ó2×8Ñ8×9ˆDØ�~‰~ Ó(Ùà&*§i¡i§o¡o×&7Ñ"�Ü"Ñ#m¸×9LÒ9LÓ#mÐosÓt�Þ"ÙäŸš K×$4Ñ$4Ó$6×$;Ñ$;Ó$=Ó>�Ü" 6¬4×0Ñ0°_ÈÓ5NÙà & Ñ 7�Ø8×?Ñ?ÓA�ØA×HÑHÓJ�ØB×IÑIÓK�
äÖ]©Ó]×]Ó]Ø;>À$Ç,Á,Ó;N˜TŸ\™\×/Ñ/°Ó4°QÒ7ÐTV�FØ"&§,¡,¸sÀf»}°A°c°U±)ÐRTÑ"U�KØ%×,Ñ,à(.Ø"-Ø&-Ø'+×'9Ñ'9ñ	÷ô# '8ñ	 :ð< !Ð r+   )rW   rX   rT   rV   rK   rH   rI   rN   rS   rM   rL   rJ   )rb   rb   FNNi,  Nr   )NNNr;   )r=   r>   r?   r@   rA   r   ÚboolrB   r)   ÚstaticmethodrZ   Úclassmethodr[   r\   r^   r   rŒ   r–   Útyper   rª   r]   ré   rï   r   rú   r   rì   rå   r#  rC   rD   r+   r(   rF   rF   `   s[  † ñð" Ø"Ø"'Ø*.Ø#'Ø Ø"&ñ&^àð&^ð �T‰zð&^ð  ð	&^ð
 ! 4™Zð&^ð ˜D‘jð&^ð ð&^ð ˜4‘Zõ&^ðP ð
˜c D™jó 
ó ð
ð ð#¸sÀT¹zð #ÐSVÐY\ÑS\ð #ÐadÐgkÑakó #ó ð#ò0ð$ ð" Sð "¨Só "ó ð"ð
Ð);¸dÑ)Bô 
ð CGñtØ%(ðtØ58¸4±Zðtà	3õtð* #'Ø-1Ø $ñ0Fà"ð0Fð ˜4‘Kð0Fð $ d™?ð	0Fð
 ˜‘:ð0Fð 
õ0Fðj .2Ø"&Ø $ñ0 à"ð0 ð $ d™?ð0 ð ˜4‘Kð	0 ð
 ˜‘:ð0 ð 
Lõ0 ðdTÀô Tôl!ð
 àaeñIØ ðIØ-^ðIà	ôIó ðIð@ Øñ1! #¨¡*ð 1!¸¸T¹
ô 1!ó ó ó1!r+   rF   ) rA   rÛ   r3   rÇ   r"   Úcollections.abcr   Ú	functoolsr   Útypingr   Úhuggingface_hubr   r   r“   r   r	   Úutilsr   r   r   r   r   r   r   r   Ú
get_loggerr=   r8   rr   r   rF   rD   r+   r(   Ú<module>r/     ss   ðñó Û 	Û Û Ý $Ý Ý  å *Ý ã ß Då ß XÓ Xö ßUÑUð 
×	Ò	˜HÓ	%€ð /€	÷/uñ /u÷dh!ò h!r+   