Ë
    ÛÓ^j¤O  ã                   ó   — d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlZddlmZmZ d	d
lmZ ddlmZmZmZ e
r
ddlmZmZmZ  ej2                  e«      Z G d„ d«      Z G d„ d«      Zy)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)ÚPreTrainedModelÚPreTrainedTokenizerFastÚProcessorMixinc            	       óF   — e Zd ZdZ	 	 ddddedddd	fd
„Zdd„Zdd„Zdd„Zy)Ú
TimedModelad  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                 ó  — || _         t        |j                  «      | _        || _        || _        || _        t        j                  | j
                  | j                  «      | _
        | j                  j                  «        y ©N)r   ÚstrÚname_or_pathÚ_name_or_pathr   r   Ú
_on_unloadÚ	threadingÚTimerÚ_timeout_reachedÚ_timerÚstart)Úselfr   r   r   r   s        úq/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/cli/serving/model_manager.pyÚ__init__zTimedModel.__init__5   sb   € ð ˆŒ
Ü  ×!3Ñ!3Ó4ˆÔØ"ˆŒØ.ˆÔØ#ˆŒÜ—o‘o d×&:Ñ&:¸D×<QÑ<QÓRˆŒØ�‰×ÑÕó    c                 óÊ   — | j                   j                  «        t        j                  | j                  | j
                  «      | _         | j                   j                  «        y)z4Reset the inactivity timer (called on each request).N)r#   Úcancelr    r!   r   r"   r$   ©r%   s    r&   Úreset_timerzTimedModel.reset_timerD   s@   € à�‰×ÑÔÜ—o‘o d×&:Ñ&:¸D×<QÑ<QÓRˆŒØ�‰×ÑÕr(   c                 ó  — t        | d«      ru| j                  �h| `| `d| _        d| _        t        j                  «        t        «        | j                  j                  «        | j                  �| j                  «        yyyy)z0Delete the model and processor, free GPU memory.r   N)	Úhasattrr   r   ÚgcÚcollectr   r#   r*   r   r+   s    r&   Údelete_modelzTimedModel.delete_modelJ   sm   € ä�4˜Ô! d§j¡jÐ&<Ø�
Ø�ØˆDŒJØ!ˆDŒNÜ�J‰JŒLÜÔØ�K‰K×ÑÔ Ø�‰Ð*Ø—‘Õ!ð +ð '=Ð!r(   c                 ó¢   — | j                   dkD  r@| j                  «        t        j                  | j                  › d| j                   › d�«       y y )Nr   z was removed from memory after zs of inactivity)r   r1   ÚloggerÚinfor   r+   s    r&   r"   zTimedModel._timeout_reachedW   sJ   € Ø×Ñ !Ò#Ø×ÑÔÜ�K‰K˜4×-Ñ-Ð.Ð.MÈd×NbÑNbÐMcÐcrÐsÕtð $r(   ©NN©ÚreturnN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr'   r,   r1   r"   © r(   r&   r   r   +   sM   „ ñð HLØ'+ñà ðð ðð Eð	ð
 %óóó"ôur(   r   c                   ó¤  — e Zd ZdZ	 	 	 	 	 	 	 d#dededz  dededz  dedz  ded	edz  fd
„Zededz  fd„«       Z	e
dedz  deez  dedz  fd„«       Zd„ Zededefd„«       Zdedz  fd„Zdeddfd„Z	 d$dededz  dedz  ddfd„Z	 	 d$dededz  dedz  ddfd„Zdefd„Zd%d„Ze	 d&dddddefd „«       Zeed&d!edz  dee   fd"„«       «       Zy)'ÚModelManageraÅ  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                 óÐ  — i | _         i | _        t        j                  «       | _        i | _        i | _        |j                  «       rt        |«      n|| _	        | j                  |«      | _        || _        | j                  || j                  «      | _        || _        || _        || _        | j%                  «        |�d| _        |�!| j'                  | j)                  |«      «       y y )Néÿÿÿÿ)Úloaded_modelsÚ_model_locksr    ÚLockÚ_model_locks_guardÚ_loading_subscribersÚ_loading_tasksÚisdigitr<   r@   Ú_resolve_dtyperA   rB   Ú_resolve_attn_implementationrC   rD   rE   rF   Ú_validate_argsÚload_model_and_processorÚprocess_model_name)r%   r@   rA   rB   rC   rD   rE   rF   s           r&   r'   zModelManager.__init__m   sâ   € ð 57ˆÔð 8:ˆÔÜ"+§.¡.Ó"2ˆÔð QSˆÔ!Ø79ˆÔð &,§^¡^Ô%5”c˜&”k¸6ˆŒØ×(Ñ(¨Ó/ˆŒ
Ø!2ˆÔØ#'×#DÑ#DÐEXÐZ^×ZeÑZeÓ#fˆÔ Ø(ˆÔØ*ˆÔØ&ˆÔà×ÑÔð Ð"Ø!#ˆDÔð Ð"Ø×)Ñ)¨$×*AÑ*AÀ+Ó*NÕOð #r(   c                 ó~   — dd l }| dv r| S t        || d «      }t        ||j                  «      st	        d| › d�«      ‚|S )Nr   )ÚautoNzUnsupported dtype: 'zF'. Must be 'auto' or a valid torch dtype (e.g. 'float16', 'bfloat16').)ÚtorchÚgetattrÚ
isinstancerA   Ú
ValueError)rA   rW   Úresolveds      r&   rP   zModelManager._resolve_dtype”   sO   € ãà�NÑ"ØˆLÜ˜5 %¨Ó.ˆÜ˜( E§K¡KÔ0ÜØ& u gÐ-sÐtóð ð ˆr(   r7   c                 ó:  — |�|S ddl }ddlm} t        |t        «      xr |j                  d«      xsH |dk(  xrA |j                  j                  j                  «       xr |j                  j                  «        }|r |«       rt        j                  d«       y|S )	zD
        Default to a fast kernel for `mps` when available.
        Nr   r
   )Úis_kernels_availableÚmpsrV   z¼MPS detected and `kernels` is installed: defaulting attention to `kernels-community/metal-flash-sdpa@223ca3350d7ba32ecf19341ff2cbb8c43fa47d62. Pass `--attn-implementation sdpa` to opt out.zKkernels-community/metal-flash-sdpa@223ca3350d7ba32ecf19341ff2cbb8c43fa47d62)rW   Úutils.import_utilsr]   rY   r   Ú
startswithÚbackendsr^   Úis_availableÚcudar3   Úwarning_once)ÚclsrC   r@   rW   r]   Úis_mps_devices         r&   rQ   z)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Ü×Ñð@ôð
 aØ"Ð"r(   c                 ó<  — | j                   �'| j                   dvrt        d| j                   › d�«      ‚h d£}| j                  d uxr | j                  j                  d«      }| j                  �.|s+| j                  |vrt        d| j                  › d|› d�«      ‚y y y )	N)úbnb-4bitúbnb-8bitz"Unsupported quantization method: 'z$'. Must be 'bnb-4bit' or 'bnb-8bit'.>   ÚsdpaÚeagerÚflex_attentionÚflash_attention_2Úflash_attention_3zkernels-community/z'Unsupported attention implementation: 'z'. Must be one of zF or a kernels-community kernel (e.g. 'kernels-community/flash-attn2').)rD   rZ   rC   r`   )r%   ÚVALID_ATTN_IMPLEMENTATIONSÚis_kernels_communitys      r&   rR   zModelManager._validate_args»   sÖ   € Ø×ÑÐ(¨T×->Ñ->ÐF^Ñ-^ÜØ4°T×5FÑ5FÐ4GÐGkÐlóð ò &sÐ"Ø#×7Ñ7¸tÐCò  
È×H`ÑH`×HkÑHkØ óI
Ðð ×$Ñ$Ð0Ù(Ø×(Ñ(Ð0JÑJäØ9¸$×:RÑ:RÐ9Sð T"Ø"<Ð!=ð  >DðEóð ð Kð )ð 1r(   Úmodel_idc                 ó   — d| v r| S | › d�S )zBCanonicalize to `'model_id@revision'` format. Defaults to `@main`.ú@z@mainr=   )rq   s    r&   rT   zModelManager.process_model_nameÎ   s   € ð �(‰?ØˆOØ�˜5Ð!Ð!r(   c                 ót   — | j                   dk(  rt        ddd¬«      S | j                   dk(  rt        d¬«      S y)zIReturn a BitsAndBytesConfig based on the `quantization` setting, or None.rh   TÚnf4)Úload_in_4bitÚbnb_4bit_quant_typeÚbnb_4bit_use_double_quantri   )Úload_in_8bitN)rD   r   r+   s    r&   Úget_quantization_configz$ModelManager.get_quantization_configÕ   sD   € à×Ñ 
Ò*Ü%Ø!Ø$)Ø*.ôð ð
 ×Ñ *Ò,Ü%°4Ô8Ð8Ør(   Úmodel_id_and_revisionz(ProcessorMixin | PreTrainedTokenizerFastc                 ót   — ddl m} |j                  dd«      \  }}|j                  ||| j                  ¬«      S )zŒLoad a processor for the given model.

        Args:
            model_id_and_revision: Model ID in ``'model_id@revision'`` format.
        r   )ÚAutoProcessorrs   r   )ÚrevisionrB   )Útransformersr}   ÚsplitÚfrom_pretrainedrB   )r%   r{   r}   rq   r~   s        r&   Ú_load_processorzModelManager._load_processorá   s=   € õ 	/à2×8Ñ8¸¸aÓ@Ñˆ�(Ø×,Ñ,¨XÀÐ\`×\rÑ\rÐ,ÓsÐsr(   Ú
tqdm_classÚprogress_callbackr   c                 óÄ  — ddl m} |j                  dd«      \  }}|| j                  | j                  | j
                  | j                  |dœ}| j                  «       }|�||d<   |� |d|dd	œ«        |j                  |fi |¤Ž}	dd
l	m
}
 |	j                  |
v rddl m}  |j                  |fi |¤ŽS t        t         |	j                  d   «      } |j                  |fi |¤ŽS )aƒ  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   )Ú
AutoConfigrs   r   )r~   rC   rA   Ú
device_maprB   rƒ   Úquantization_configÚloadingÚconfig©Ústatusr   Ústage)Ú%MODEL_FOR_MULTIMODAL_LM_MAPPING_NAMES)ÚAutoModelForMultimodalLM)r   r†   r€   rC   rA   r@   rB   rz   r�   Ú&transformers.models.auto.modeling_autorŽ   Ú
model_typer�   rX   Úarchitectures)r%   r{   rƒ   r„   r†   rq   r~   Úmodel_kwargsrˆ   rŠ   rŽ   r�   Úarchitectures                r&   Ú_load_modelzModelManager._load_modelì   sú   € õ 	,à2×8Ñ8¸¸aÓ@Ñˆ�(ð !Ø#'×#;Ñ#;Ø—Z‘ZØŸ+™+Ø!%×!7Ñ!7Ø$ñ
ˆð #×:Ñ:Ó<ÐØÐ*Ø2EˆLÐ.Ñ/àÐ(Ù¨Ð=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           	      óÀ  ‡ — ‰ j                   5  ‰ j                  j                  |t        j                  «       «      }ddd«       5  |‰ j
                  vr…t        j                  d|› �«       |� |d|ddœ«       ‰ j                  |«      }‰ j                  |||¬«      }t        |‰ j                  ||fˆ fd„	¬«      ‰ j
                  |<   |�j |d	|d
dœ«       n]‰ j
                  |   j                  «        ‰ j
                  |   j                  }‰ j
                  |   j                  }|� |d	|ddœ«       ddd«       ||fS # 1 sw Y   �Œ	xY w# 1 sw Y   fS xY w)a¤  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``.
        NzLoading r‰   r   r‹   )rƒ   r„   c                 ó<   •— ‰j                   j                  | d «      S r   )rI   Úpop)Úkeyr%   s    €r&   ú<lambda>z7ModelManager.load_model_and_processor.<locals>.<lambda>6  s   ø€ À×@RÑ@R×@VÑ@VÐWZÐ\`Ó@a€ r(   )r   r   r   ÚreadyF©rŒ   r   ÚcachedT)rL   rJ   Ú
setdefaultr    rK   rI   r3   Úwarningr‚   r•   r   rE   r,   r   r   )r%   r{   r„   rƒ   Úlockr   r   s   `      r&   rS   z%ModelManager.load_model_and_processor  s…  ø€ ð ×$Ñ$ñ 	YØ×$Ñ$×/Ñ/Ð0EÄyÇ~Á~ÓGWÓXˆD÷	Yð ñ 	kØ$¨D×,>Ñ,>Ñ>Ü—‘ Ð*?Ð)@ÐAÔBØ$Ð0Ù%°ÐEZÐepÑ&qÔrØ ×0Ñ0Ð1FÓG�	Ø×(Ñ(Ø)°jÐTeð )ó �ô =GØØ$(×$6Ñ$6Ø'Ø)>Ôaô	=�×"Ñ"Ð#8Ñ9ð %Ð0Ù%°ÐCXÐdiÑ&jÕkà×"Ñ"Ð#8Ñ9×EÑEÔGØ×*Ñ*Ð+@ÑA×GÑG�Ø ×.Ñ.Ð/DÑE×OÑO�	Ø$Ð0Ù%°ÐCXÐdhÑ&iÔj÷-	kð. �iÐÐ÷5	Yñ 	Yú÷	kð. �iÐÐús   Ž/EÁC1EÅEÅEc                ó¬  ‡ ‡‡‡‡‡	K  — |Št        j                  «       }‰‰ j                  v r>‰ j                  ‰   j                  «        dt	        j
                  d‰ddœ«      › d�­–— y‰‰ j                  v rA‰ j                  ‰   j                  |«       	 |j                  «       ƒ d{  –—† }|€	 y|­–— Œ"|g‰ j                  ‰<   t        j                  «       Šdt        fˆˆˆ fd„Št        ‰‰«      Š	ˆ	fd	„Šˆˆˆˆˆ ˆ	fd
„}t        j                   |«       «      ‰ j                  ‰<   	 |j                  «       ƒ d{  –—† }|€y|­–— Œ!7 Œ¤7 Œ­w)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                 ój   •‡— dt        j                  | «      › d�Šˆˆˆfd„}‰j                  |«       y )Nr¢   r£   c                  ój   •— ‰j                   j                  ‰g «      D ]  } | j                  ‰«       Œ y r   )rM   ÚgetÚ
put_nowait)ÚqÚmidÚmsgr%   s    €€€r&   Ú	broadcastzEModelManager.load_model_streaming.<locals>.enqueue.<locals>.broadcastj  s1   ø€ Ø×2Ñ2×6Ñ6°s¸BÓ?ò &�AØ—L‘L Õ%ñ&r(   )ÚjsonÚdumpsÚcall_soon_threadsafe)r¤   r¬   r«   Úlooprª   r%   s     @€€€r&   Úenqueuez2ModelManager.load_model_streaming.<locals>.enqueueg  s0   ù€ Øœ4Ÿ:™: gÓ.Ð/¨tÐ4ˆCö&ð ×%Ñ% iÕ0r(   c                 ó   •—  ‰|i |¤ŽS r   r=   )ÚfactoryÚargsÚkwargsrƒ   s      €r&   Ú
_tqdm_hookz5ModelManager.load_model_streaming.<locals>._tqdm_hookr  s   ø€ Ù˜tÐ. vÑ.Ð.r(   c               “   óì  •K  — 	 t        j                  ‰«      } 	 t        j                  ‰j                  ‰‰‰¬«      ƒ d {  –—†  t        j                  | «       	 ˆˆfd„}‰j                  |«       y 7 Œ2# t        j                  | «       w xY w# t
        $ r<}t        j                  d‰› d|› �d¬«        ‰d‰t        |«      dœ«       Y d }~Œtd }~ww xY w# ˆˆfd„}‰j                  |«       w xY w­w)	N)r„   rƒ   zFailed to load z: T)Úexc_infoÚerror)rŒ   r   Úmessagec                  ó¢   •— ‰j                   j                  ‰g «      D ]  } | j                  d «       Œ ‰j                  j                  ‰d «       y r   )rM   r˜   r¨   rN   )r©   rª   r%   s    €€r&   Ú_send_sentinelzKModelManager.load_model_streaming.<locals>.run_load.<locals>._send_sentinel‰  sG   ø€ Ø!×6Ñ6×:Ñ:¸3ÀÓCò +˜ØŸ™ TÕ*ð+à×'Ñ'×+Ñ+¨C°Õ6r(   )
r   Úset_tqdm_hookÚasyncioÚ	to_threadrS   Ú	Exceptionr3   r¹   r   r¯   )	Úprevious_hookÚer¼   r¶   r±   r°   rª   r%   rƒ   s	      €€€€€€r&   Úrun_loadz3ModelManager.load_model_streaming.<locals>.run_loadu  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üsi   ƒC4…B ›&A6 ÁA4ÁA6 ÁB ÁC ÁC4Á4A6 Á6BÂB Â	CÂ2CÃC ÃCÃC ÃC1Ã1C4)r¾   ÚQueuerI   r,   r­   r®   rN   rM   Úappendr§   Úget_running_loopÚdictr   Úcreate_task)
r%   r{   ÚqueueÚitemrÃ   r¶   r±   r°   rª   rƒ   s
   `    @@@@@r&   Úload_model_streamingz!ModelManager.load_model_streamingB  sP  ýè ø€ ð $ˆÜ+2¯=©=«?ˆð �$×$Ñ$Ñ$Ø×Ñ˜sÑ#×/Ñ/Ô1Øœ4Ÿ:™:°À3ÐRVÑ&WÓXÐYÐY]Ð^Ó^Øð �$×%Ñ%Ñ%Ø×%Ñ% cÑ*×1Ñ1°%Ô8ØØ"ŸY™Y›[×(�Ø�<Øàð “
ð	 ð +0¨ˆ×!Ñ! #Ñ&Ü×'Ñ'Ó)ˆð	1œT÷ 	1ô .¨g°sÓ;ˆ
ô	/÷	:ñ 	:ô6 $+×#6Ñ#6±x³zÓ#Bˆ×Ñ˜CÑ àØŸ™›×$ˆDØˆ|ØØ‹Jð	 ðk )øðl %ús%   ˆB#EÂ+EÂ,BEÅEÅEÅEc                 ót   — t        | j                  j                  «       «      D ]  }|j                  «        Œ y)z,Delete all loaded models and free resources.N)ÚlistrI   Úvaluesr1   )r%   Útimeds     r&   ÚshutdownzModelManager.shutdown˜  s1   € ä˜$×,Ñ,×3Ñ3Ó5Ó6ò 	!ˆEØ×ÑÕ ñ	!r(   r   r   r   c                 ón  — |� t        |t        «      rt        j                  S ddlm}m}m} | j                  j                  }||j                  «       v rt        j                  S ||j                  «       v rt        j                  S ||j                  «       v rt        j                  S t        d|› �«      ‚)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: )rY   r	   r   ÚLLMr�   rÓ   rÔ   rŽ   Ú	__class__r8   rÎ   Ú
MULTIMODALÚVLMrZ   )r   r   rÓ   rÔ   rŽ   Úmodel_classnames         r&   Úget_model_modalityzModelManager.get_model_modality�  s£   € ð Ð ¤Z°	Ô;RÔ%SÜ—<‘<Ð÷	
ñ 	
ð  Ÿ/™/×2Ñ2ˆØÐC×JÑJÓLÑLÜ×&Ñ&Ð&ØÐ J× QÑ QÓ SÑSÜ—<‘<ÐØÐ A× HÑ HÓ JÑJÜ—<‘<ÐäÐ5°oÐ5FÐGÓHÐHr(   Ú	cache_dirc           	      ó2  ‡‡‡— ddl m}m}m} g }t        j                  d«       t        t        | «      j                  «      D �]P  }|j                  dk7  rŒ|j                  j                  «       D �]  \  }}t        d„ |j                  D «       d«      }|sŒ't        j                  |j!                  «       j#                  «       «      }	t%        |	t&        «      rd|	v sŒm|	d   }
|j)                  «       Š|j)                  «       Š|j)                  «       Št+        ˆˆˆfd„|
D «       «      sŒ¹d	|j,                  v r|j,                  j/                  d	«      d   nd
}|j,                  |dk7  rd|› �nd
z   }|j1                  ||d|j2                  dœ«       �Œ" �ŒS |S )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   óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­w)zconfig.jsonN)Ú	file_nameÚ	file_path)Ú.0Úfs     r&   ú	<genexpr>z.ModelManager.get_gen_models.<locals>.<genexpr>Ø  s#   è ø€ Ò#m°AÐPQ×P[ÑP[Ð_lÓPl A§K¥KÑ#mùs   ‚(—(Nr’   c              3   ó8   •K  — | ]  }|g ‰¢‰¢‰¢v sŒ|–— Œ y ­wr   r=   )rà   ÚarchÚllmsÚ
multimodalÚvlmss     €€€r&   râ   z.ModelManager.get_gen_models.<locals>.<genexpr>å  s)   øè ø€ Ò] ¸ÐA\À4ÐA\È$ÐA\ÐQ[ÐA\Ò9\”tÑ]ùs   ƒ“ú/Ú Úmainrs   )Úowned_byÚidÚobjectÚcreated)r�   rÓ   rÔ   rŽ   r3   rŸ   r   r   ÚreposÚ	repo_typeÚrefsÚitemsÚnextÚfilesr­   ÚloadsÚopenÚreadrY   rÇ   rÎ   ÚanyÚrepo_idr€   rÅ   Úlast_modified)rÛ   rÓ   rÔ   rŽ   Úgenerative_modelsÚrepoÚrefÚrevision_infoÚconfig_pathrŠ   r’   ÚauthorÚrepo_handlerå   ræ   rç   s                @@@r&   Úget_gen_modelszModelManager.get_gen_models¾  su  ú€ ÷	
ñ 	
ð ÐÜ�‰Ð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°_ÈÑ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ñ	öò#ð		ð< !Ð r(   )rV   rV   FNNi,  Nr5   r6   r   )r8   r9   r:   r;   r   Úboolr<   r'   ÚstaticmethodrP   ÚclassmethodrQ   rR   rT   r   rz   r‚   Útyper   r•   rS   rË   rÐ   r   rÚ   r   rÍ   rÇ   r  r=   r(   r&   r?   r?   ]   s  „ ñð" Ø"Ø"'Ø*.Ø#'Ø Ø"&ñ%Pàð%Pð �T‰zð%Pð  ð	%Pð
 ! 4™Zð%Pð ˜D‘jð%Pð ð%Pð ˜4‘Zó%PðN ð
˜c D™jò 
ó ð
ð ð#¸sÀT¹zð #ÐSVÐY\ÑS\ð #ÐadÐgkÑakò #ó ð#ò2ð& ð" Sð "¨Sò "ó ð"ð
Ð);¸dÑ)Bó 
ð	t°Sð 	tÐ=gó 	tð ptñ)FØ%(ð)FØ6:¸T±kð)FØ]eÐhlÑ]lð)Fà	ó)Fð\ .2Ø"&ñ	) à"ð) ð $ d™?ð) ð ˜4‘Kð	) ð
 
Ló) ðVTÀó Tól!ð
 àaeñIØ ðIØ-^ðIà	òIó ðIð@ Øñ1! #¨¡*ð 1!¸¸T¹
ò 1!ó ó ñ1!r(   r?   )r;   r¾   r/   r­   r    Úcollections.abcr   Ú	functoolsr   Útypingr   Úhuggingface_hubr   r   r   r   r	   Úutilsr   r   r   r   r   r   r   Ú
get_loggerr8   r3   r   r?   r=   r(   r&   ú<module>r     sn   ðñó Û 	Û Û Ý $Ý Ý  å *Ý ã ß Då ß HÑ Hñ ßUÑUð 
ˆ×	Ñ	˜HÓ	%€÷/uñ /u÷dT!ò T!r(   