§
    ‚Štj¤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j        e¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )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            	       óH   — 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dS )Ú
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
                             ¦   «          d S ©N)r   ÚstrÚname_or_pathÚ_name_or_pathr   r   Ú
_on_unloadÚ	threadingÚTimerÚ_timeout_reachedÚ_timerÚstart)Úselfr   r   r   r   s        úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/cli/serving/model_manager.pyÚ__init__zTimedModel.__init__5   sg   € ð ˆŒ
Ý  Ô!3Ñ4Ô4ˆÔØ"ˆŒØ.ˆÔØ#ˆŒÝ”o dÔ&:¸DÔ<QÑRÔRˆŒØŒ×ÒÑÔÐÐÐó    Úreturnc                 ó²   — | j                              ¦   «          t          j        | j        | j        ¦  «        | _         | j                              ¦   «          dS )z4Reset the inactivity timer (called on each request).N)r#   Úcancelr    r!   r   r"   r$   ©r%   s    r&   Úreset_timerzTimedModel.reset_timerD   sI   € àŒ×ÒÑÔÐÝ”o dÔ&:¸DÔ<QÑRÔRˆŒØŒ×ÒÑÔÐÐÐr(   c                 ó  — t          | d¦  «        rp| j        �k| `| `d| _        d| _        t          j        ¦   «          t          ¦   «          | j                             ¦   «          | j        �|                      ¦   «          dS dS dS dS )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   s”   € å�4˜Ñ!Ô!ð 		" d¤jÐ&<Ø�
Ø�ØˆDŒJØ!ˆDŒNÝŒJ‰LŒLˆLÝÑÔÐØŒK×ÒÑ Ô Ð ØŒÐ*Ø—’Ñ!Ô!Ð!Ð!Ð!ð		"ð 		"Ð&<Ð&<ð +Ð*r(   c                 óœ   — | j         dk    r@|                      ¦   «          t                               | j        › d| j         › d�¦  «         d S d S )Nr   z was removed from memory after zs of inactivity)r   r2   ÚloggerÚinfor   r,   s    r&   r"   zTimedModel._timeout_reachedW   sY   € ØÔ !Ò#Ð#Ø×ÒÑÔÐÝ�KŠK˜4Ô-ÐsÐsÈdÔNbÐsÐsÐsÑtÔtÐtÐtÐtð $Ð#r(   ©NN©r)   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr'   r-   r2   r"   © r(   r&   r   r   +   sª   € € € € € ðð ð HLØ'+ðð à ðð ðð Eð	ð
 %ðð ð ð ðð ð ð ð"ð "ð "ð "ðuð uð uð uð uð 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dS )*Ú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.
    ÚautoFNé,  ÚdeviceÚdtypeÚtrust_remote_codeÚattn_implementationÚquantizationÚmodel_timeoutÚforce_modelc                 ó   — i | _         i | _        t          j        ¦   «         | _        i | _        i | _        |                     ¦   «         rt          |¦  «        n|| _	        |  
                    |¦  «        | _        || _        |                      || j	        ¦  «        | _        || _        || _        || _        |                      ¦   «          |�d| _        |�*|                      |                      |¦  «        ¦  «         d S d S )Néÿÿÿÿ)Úloaded_modelsÚ_model_locksr    ÚLockÚ_model_locks_guardÚ_loading_subscribersÚ_loading_tasksÚisdigitr<   rB   Ú_resolve_dtyperC   rD   Ú_resolve_attn_implementationrE   rF   rG   rH   Ú_validate_argsÚload_model_and_processorÚprocess_model_name)r%   rB   rC   rD   rE   rF   rG   rH   s           r&   r'   zModelManager.__init__m   s  € ð 57ˆÔð 8:ˆÔÝ"+¤.Ñ"2Ô"2ˆÔð QSˆÔ!Ø79ˆÔð &,§^¢^Ñ%5Ô%5ÐA•c˜&‘k”k�k¸6ˆŒØ×(Ò(¨Ñ/Ô/ˆŒ
Ø!2ˆÔØ#'×#DÒ#DÐEXÐZ^ÔZeÑ#fÔ#fˆÔ Ø(ˆÔØ*ˆÔØ&ˆÔà×ÒÑÔÐð Ð"Ø!#ˆDÔð Ð"Ø×)Ò)¨$×*AÒ*AÀ+Ñ*NÔ*NÑOÔOÐOÐOÐOð #Ð"r(   c                 óŒ   — dd l }| dv r| S t          || d ¦  «        }t          ||j        ¦  «        st	          d| › d�¦  «        ‚|S )Nr   )r@   NzUnsupported dtype: 'zF'. Must be 'auto' or a valid torch dtype (e.g. 'float16', 'bfloat16').)ÚtorchÚgetattrÚ
isinstancerC   Ú
ValueError)rC   rX   Úresolveds      r&   rR   zModelManager._resolve_dtype”   sg   € àˆˆˆà�NÐ"Ð"ØˆLÝ˜5 %¨Ñ.Ô.ˆÝ˜( E¤KÑ0Ô0ð 	ÝØt uÐtÐtÐtñô ð ð ˆr(   r)   c                 óB  — |�|S ddl }ddlm} t          |t          ¦  «        r|                     d¦  «        p=|dk    o7|j        j                             ¦   «         o|j	                             ¦   «          }|r& |¦   «         rt                               d¦  «         dS |S )	zD
        Default to a fast kernel for `mps` when available.
        Nr   r
   )Úis_kernels_availableÚmpsr@   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)rX   Úutils.import_utilsr^   rZ   r   Ú
startswithÚbackendsr_   Úis_availableÚcudar4   Úwarning_once)ÚclsrE   rB   rX   r^   Úis_mps_devices         r&   rS   z)ModelManager._resolve_attn_implementation¡   sÙ   € ð
 Ð*Ø&Ð&àˆˆˆà>Ð>Ð>Ð>Ð>Ð>õ �v�sÑ#Ô#ð )Ø×!Ò! %Ñ(Ô(ðjà˜&Ò Ðh U¤^Ô%7×%DÒ%DÑ%FÔ%FÐhÈuÌz×OfÒOfÑOhÔOhÐKhð 	ð
 ð 	aÐ1Ð1Ñ3Ô3ð 	aÝ×Òð@ñô ð ð
 aÐ`Ø"Ð"r(   c                 ó  — | j         �!| j         dvrt          d| j         › d�¦  «        ‚h d£}| j        d uo| j                             d¦  «        }| j        �&|s&| j        |vrt          d| j        › d|› d�¦  «        ‚d S d S d S )	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').)rF   r[   rE   ra   )r%   ÚVALID_ATTN_IMPLEMENTATIONSÚis_kernels_communitys      r&   rT   zModelManager._validate_args»   sì   € ØÔÐ(¨TÔ->ÐF^Ð-^Ð-^ÝØl°TÔ5FÐlÐlÐlñô ð ð &sÐ%rÐ%rÐ"Ø#Ô7¸tÐCð  
ÈÔH`×HkÒHkØ ñI
ô I
Ðð Ô$Ð0Ø(ð 1àÔ(Ð0JÐJÐJåðE¸$Ô:Rð Eð EØ"<ðEð Eð Eñô ð ð	 1Ð0Ð0Ð0àJÐJr(   Úmodel_idc                 ó   — d| v r| S | › d�S )zBCanonicalize to `'model_id@revision'` format. Defaults to `@main`.ú@z@mainr=   )rr   s    r&   rV   zModelManager.process_model_nameÎ   s!   € ð �(ˆ?ˆ?ØˆOØÐ!Ð!Ð!Ð!r(   c                 óv   — | j         dk    rt          ddd¬¦  «        S | j         dk    rt          d¬¦  «        S dS )zIReturn a BitsAndBytesConfig based on the `quantization` setting, or None.ri   TÚnf4)Úload_in_4bitÚbnb_4bit_quant_typeÚbnb_4bit_use_double_quantrj   )Úload_in_8bitN)rF   r   r,   s    r&   Úget_quantization_configz$ModelManager.get_quantization_configÕ   sV   € àÔ 
Ò*Ð*Ý%Ø!Ø$)Ø*.ðñ ô ð ð
 Ô *Ò,Ð,Ý%°4Ð8Ñ8Ô8Ð8Øˆtr(   Úmodel_id_and_revisionz(ProcessorMixin | PreTrainedTokenizerFastc                 óz   — ddl m} |                     dd¦  «        \  }}|                     ||| j        ¬¦  «        S )zŒLoad a processor for the given model.

        Args:
            model_id_and_revision: Model ID in ``'model_id@revision'`` format.
        r   )ÚAutoProcessorrt   r   )ÚrevisionrD   )Útransformersr~   ÚsplitÚfrom_pretrainedrD   )r%   r|   r~   rr   r   s        r&   Ú_load_processorzModelManager._load_processorá   sO   € ð 	/Ð.Ð.Ð.Ð.Ð.à2×8Ò8¸¸aÑ@Ô@Ñˆ�(Ø×,Ò,¨XÀÐ\`Ô\rÐ,ÑsÔsÐsr(   Ú
tqdm_classÚprogress_callbackr   c                 ó�  — ddl m} |                     dd¦  «        \  }}|| j        | j        | j        | j        |dœ}|                      ¦   «         }|�||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   )Ú
AutoConfigrt   r   )r   rE   rC   Ú
device_maprD   r„   NÚquantization_configÚloadingÚconfig©Ústatusr   Ústage)Ú%MODEL_FOR_MULTIMODAL_LM_MAPPING_NAMES)ÚAutoModelForMultimodalLM)r€   r‡   r�   rE   rC   rB   rD   r{   r‚   Ú&transformers.models.auto.modeling_autor�   Ú
model_typer�   rY   Úarchitectures)r%   r|   r„   r…   r‡   rr   r   Úmodel_kwargsr‰   r‹   r�   r�   Úarchitectures                r&   Ú_load_modelzModelManager._load_modelì   s=  € ð 	,Ð+Ð+Ð+Ð+Ð+à2×8Ò8¸¸aÑ@Ô@Ñˆ�(ð !Ø#'Ô#;Ø”ZØœ+Ø!%Ô!7Ø$ð
ð 
ˆð #×:Ò:Ñ<Ô<ÐØÐ*Ø2EˆLÐ.Ñ/àÐ(ØÐ¨Ð=RÐ]eÐfÐfÑgÔgÐgØ+�Ô+¨HÐEÐE¸ÐEÐEˆà`Ð`Ð`Ð`Ð`Ð`àÔÐ EÐEÐEØ=Ð=Ð=Ð=Ð=Ð=à;Ð+Ô;¸HÐUÐUÈÐUÐUÐUå�|¨VÔ-AÀ!Ô-DÑEÔEˆØ+ˆ|Ô+¨HÐEÐE¸ÐEÐEÐEr(   z@tuple[PreTrainedModel, ProcessorMixin | PreTrainedTokenizerFast]c           	      ó´  ‡ — ‰ j         5  ‰ j                             |t          j        ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   |5  |‰ j        vr’t                               d|› �¦  «         |� |d|ddœ¦  «         ‰                      |¦  «        }‰  	                    |||¬¦  «        }t          |‰ j        ||fˆ fd„	¬¦  «        ‰ j        |<   |� |d	|d
dœ¦  «         nT‰ j        |                              ¦   «          ‰ j        |         j        }‰ j        |         j        }|� |d	|ddœ¦  «         ddd¦  «         n# 1 swxY w Y   ||fS )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                              | d ¦  «        S r   )rK   Úpop)Úkeyr%   s    €r&   ú<lambda>z7ModelManager.load_model_and_processor.<locals>.<lambda>6  s   ø€ ÀÔ@R×@VÒ@VÐWZÐ\`Ñ@aÔ@a€ r(   )r   r   r   ÚreadyF©r�   r   ÚcachedT)rN   rL   Ú
setdefaultr    rM   rK   r4   Úwarningrƒ   r–   r   rG   r-   r   r   )r%   r|   r…   r„   Úlockr   r   s   `      r&   rU   z%ModelManager.load_model_and_processor  sW  ø€ ð Ô$ð 	Yð 	YØÔ$×/Ò/Ð0EÅyÄ~ÑGWÔGWÑXÔXˆDð	Yð 	Yð 	Yñ 	Yô 	Yð 	Yð 	Yð 	Yð 	Yð 	Yð 	Yøøøð 	Yð 	Yð 	Yð 	Yð ð 	kð 	kØ$¨DÔ,>Ð>Ð>Ý—’ÐAÐ*?ÐAÐAÑBÔBÐBØ$Ð0Ø%Ð%°ÐEZÐepÐ&qÐ&qÑrÔrÐrØ ×0Ò0Ð1FÑGÔG�	Ø×(Ò(Ø)°jÐTeð )ñ ô �õ =GØØ$(Ô$6Ø'Ø)>ÐaÐaÐaÐaÐað	=ñ =ô =�Ô"Ð#8Ñ9ð %Ð0Ø%Ð%°ÐCXÐdiÐ&jÐ&jÑkÔkÐkøàÔ"Ð#8Ô9×EÒEÑGÔGÐGØÔ*Ð+@ÔAÔG�Ø Ô.Ð/DÔEÔO�	Ø$Ð0Ø%Ð%°ÐCXÐdhÐ&iÐ&iÑjÔjÐjð-	kð 	kð 	kñ 	kô 	kð 	kð 	kð 	kð 	kð 	kð 	køøøð 	kð 	kð 	kð 	kð. �iÐÐs$   ‰-AÁAÁ	AÁC0EÅEÅEc                ó–  ‡ ‡‡‡‡‡	K  — |Št          j        ¦   «         }‰‰ j        v r@‰ j        ‰                              ¦   «          dt	          j        d‰ddœ¦  «        › d�W V — dS ‰‰ j        v rF‰ j        ‰                              |¦  «         	 | 	                    ¦   «         ƒ d{V —†}|€n|W V — Œ#dS |g‰ j        ‰<   t          j
        ¦   «         Šdt          fˆˆˆ fd„Št          ‰‰¦  «        Š	ˆ	fd	„Šˆˆˆˆˆ ˆ	fd
„}t          j         |¦   «         ¦  «        ‰ j        ‰<   	 | 	                    ¦   «         ƒ d{V —†}|€dS |W V — Œ$)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                 ór   •‡— dt          j        | ¦  «        › d�Šˆˆˆfd„}‰                     |¦  «         d S )Nr£   r¤   c                  ón   •— ‰j                              ‰g ¦  «        D ]} |                      ‰¦  «         Œd S r   )rO   ÚgetÚ
put_nowait)ÚqÚmidÚmsgr%   s    €€€r&   Ú	broadcastzEModelManager.load_model_streaming.<locals>.enqueue.<locals>.broadcastj  sD   ø€ ØÔ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  s]   øø€ Ø4�4œ: gÑ.Ô.Ð4Ð4Ð4ˆCð&ð &ð &ð &ð &ð &ð &ð ×%Ò% iÑ0Ô0Ð0Ð0Ð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 {V —† t          j        | ¦  «         n# t          j        | ¦  «         w xY wnU# t
          $ rH}t                               d‰› d|› �d¬¦  «          ‰d‰t          |¦  «        dœ¦  «         Y d }~nd }~ww xY wˆˆfd„}‰ 	                    |¦  «         d S # ˆˆfd„}‰ 	                    |¦  «         w xY w)	N)r…   r„   zFailed to load z: T)Úexc_infoÚerror)r�   r   Úmessagec                  ó¤   •— ‰j                              ‰g ¦  «        D ]} |                      d ¦  «         Œ‰j                             ‰d ¦  «         d S r   )rO   r™   r©   rP   )rª   r«   r%   s    €€r&   Ú_send_sentinelzKModelManager.load_model_streaming.<locals>.run_load.<locals>._send_sentinel‰  sY   ø€ Ø!Ô6×:Ò:¸3ÀÑCÔCð +ð +˜ØŸš TÑ*Ô*Ð*Ð*ØÔ'×+Ò+¨C°Ñ6Ô6Ð6Ð6Ð6r(   )
r   Úset_tqdm_hookÚasyncioÚ	to_threadrU   Ú	Exceptionr4   rº   r   r°   )	Úprevious_hookÚer½   r·   r²   r±   r«   r%   r„   s	      €€€€€€r&   Úrun_loadz3ModelManager.load_model_streaming.<locals>.run_loadu  sˆ  øè è € ð:õ !(Ô 5°jÑ AÔ A�ð9Ý!Ô+ØÔ5ØØ*1Ø#-ð	ñ ô ð ð ð ð ð ð ð õ Ô)¨-Ñ8Ô8Ð8Ð8ø•GÔ)¨-Ñ8Ô8Ð8Ð8øøøÐ8øÝð Nð Nð NÝ—’Ð9¨sÐ9Ð9°aÐ9Ð9ÀD�ÑIÔIÐIØ� 7°SÅSÈÁVÄVÐLÐLÑMÔMÐMÐMÐMÐMÐMÐMøøøøðNøøøð
7ð 7ð 7ð 7ð 7ð 7ð
 ×)Ò)¨.Ñ9Ô9Ð9Ð9Ð9øð7ð 7ð 7ð 7ð 7ð 7ð
 ×)Ò)¨.Ñ9Ô9Ð9Ð9øøøsE   …A, š#A ½A, ÁA(Á(A, Á+C Á,
B>Á6>B9Â4C Â9B>Â>C ÃC;)r¿   ÚQueuerK   r-   r®   r¯   rP   rO   Ú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  só  øøøøøøè è € ð $ˆÝ+2¬=©?¬?ˆð �$Ô$Ð$Ð$ØÔ˜sÔ#×/Ò/Ñ1Ô1Ð1Ø^�4œ:°À3ÐRVÐ&WÐ&WÑXÔXÐ^Ð^Ð^Ð^Ð^Ð^Ð^ØˆFð �$Ô%Ð%Ð%ØÔ% cÔ*×1Ò1°%Ñ8Ô8Ð8ðØ"ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�Ø�<ØØ�
�
�
�
ð	ð
 ˆFð +0¨ˆÔ! #Ñ&ÝÔ'Ñ)Ô)ˆð	1�Tð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1õ .¨g°sÑ;Ô;ˆ
ð	/ð 	/ð 	/ð 	/ð 	/ð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:õ6 $+Ô#6°x°x±z´zÑ#BÔ#BˆÔ˜CÑ ð	ØŸš™œÐ$Ð$Ð$Ð$Ð$Ð$ˆDØˆ|Ø�ØˆJˆJˆJˆJð		r(   c                 ó€   — t          | j                             ¦   «         ¦  «        D ]}|                     ¦   «          ŒdS )z,Delete all loaded models and free resources.N)ÚlistrK   Úvaluesr2   )r%   Útimeds     r&   ÚshutdownzModelManager.shutdown˜  sG   € å˜$Ô,×3Ò3Ñ5Ô5Ñ6Ô6ð 	!ð 	!ˆEØ×ÒÑ Ô Ð Ð ð	!ð 	!r(   r   r   r   c                 ód  — |�!t          |t          ¦  «        rt          j        S ddlm}m}m} | j        j	        }|| 
                    ¦   «         v rt          j        S || 
                    ¦   «         v rt          j        S || 
                    ¦   «         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``).
        Nr   ©Ú!MODEL_FOR_CAUSAL_LM_MAPPING_NAMESÚ*MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMESr�   zUnknown modality for: )rZ   r	   r   ÚLLMr‘   rÔ   rÕ   r�   Ú	__class__r8   rÏ   Ú
MULTIMODALÚVLMr[   )r   r   rÔ   rÕ   r�   Úmodel_classnames         r&   Úget_model_modalityzModelManager.get_model_modality�  sØ   € ð Ð ¥Z°	Õ;RÑ%SÔ%SÐ Ý”<Ðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð  œ/Ô2ˆØÐC×JÒJÑLÔLÐLÐLÝÔ&Ð&ØÐ J× QÒ QÑ SÔ SÐSÐSÝ”<ÐØÐ A× HÒ HÑ JÔ JÐJÐJÝ”<ÐåÐG°oÐGÐGÑHÔHÐHr(   Ú	cache_dirc           	      óf  ‡‡‡— ddl m}m}m} g }t                               d¦  «         t          t          | ¦  «        j        ¦  «        D �]d}|j	        dk    rŒ|j
                             ¦   «         D �]:\  }}t          d„ |j        D ¦   «         d¦  «        }|sŒ(t          j        |                     ¦   «                              ¦   «         ¦  «        }	t%          |	t&          ¦  «        rd|	v sŒz|	d         }
|                     ¦   «         Š|                     ¦   «         Š|                     ¦   «         Št+          ˆˆˆfd„|
D ¦   «         ¦  «        r_d	|j        v r |j                             d	¦  «        d         nd
}|j        |dk    rd|› �nd
z   }|                     ||d|j        dœ¦  «         �Œ<�Œf|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   ó:   K  — | ]}|j         d k    ¯|j        V — ŒdS )zconfig.jsonN)Ú	file_nameÚ	file_path)Ú.0Úfs     r&   ú	<genexpr>z.ModelManager.get_gen_models.<locals>.<genexpr>Ø  s3   è è € Ð#mÐ#m°AÐPQÔP[Ð_lÒPlÐPl A¤KÐPlÐPlÐPlÐPlÐ#mÐ#mr(   Nr“   c              3   ó0   •K  — | ]}|g ‰¢‰¢‰¢v ¯|V — Œd S r   r=   )rá   ÚarchÚllmsÚ
multimodalÚvlmss     €€€r&   rã   z.ModelManager.get_gen_models.<locals>.<genexpr>å  s>   øè è € Ð]Ð] ¸ÐA\À4ÐA\È$ÐA\ÐQ[ÐA\Ð9\Ð9\�tÐ9\Ð9\Ð9\Ð9\Ð]Ð]r(   ú/Ú Úmainrt   )Úowned_byÚidÚobjectÚcreated)r‘   rÔ   rÕ   r�   r4   r    r   r   ÚreposÚ	repo_typeÚrefsÚitemsÚnextÚfilesr®   ÚloadsÚopenÚreadrZ   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¾  s	  øøø€ ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ÐÝ�ŠÐHÑIÔIÐIå�¨	Ñ2Ô2Ô8Ñ9Ô9ð 	ñ 	ˆDØŒ~ Ò(Ð(Øà&*¤i§o¢oÑ&7Ô&7ð ñ Ñ"��]Ý"Ð#mÐ#m¸Ô9LÐ#mÑ#mÔ#mÐosÑtÔt�Ø"ð Øåœ K×$4Ò$4Ñ$6Ô$6×$;Ò$;Ñ$=Ô$=Ñ>Ô>�Ý" 6­4Ñ0Ô0ð °_ÈÐ5NÐ5NØà & Ô 7�Ø8×?Ò?ÑAÔA�ØA×HÒHÑJÔJ�ØB×IÒIÑKÔK�
åÐ]Ð]Ð]Ð]Ð]Ð]¨Ð]Ñ]Ô]Ñ]Ô]ð 
Ø;>À$Ä,Ð;NÐ;N˜Tœ\×/Ò/°Ñ4Ô4°QÔ7Ð7ÐTV�FØ"&¤,¸sÀfº}¸}°)°c°)°)°)ÐRTÑ"U�KØ%×,Ò,à(.Ø"-Ø&-Ø'+Ô'9ð	ð ñô ð ùñ#ð4 !Ð r(   )r@   r@   FNNrA   Nr6   r7   r   )r8   r9   r:   r;   r   Úboolr<   r'   ÚstaticmethodrR   ÚclassmethodrS   rT   rV   r   r{   rƒ   Útyper   r–   rU   rÌ   rÑ   r   rÛ   r   rÎ   rÈ   r  r=   r(   r&   r?   r?   ]   s  € € € € € ðð ð" Ø"Ø"'Ø*.Ø#'Ø Ø"&ð%Pð %Pàð%Pð �T‰zð%Pð  ð	%Pð
 ! 4™Zð%Pð ˜D‘jð%Pð ð%Pð ˜4‘Zð%Pð %Pð %Pð %PðN ð
˜c D™jð 
ð 
ð 
ñ „\ð
ð ð#¸sÀT¹zð #ÐSVÐY\ÑS\ð #ÐadÐgkÑakð #ð #ð #ñ „[ð#ð2ð ð ð& ð" Sð "¨Sð "ð "ð "ñ „\ð"ð
Ð);¸dÑ)Bð 
ð 
ð 
ð 
ð	t°Sð 	tÐ=gð 	tð 	tð 	tð 	tð ptð)Fð )FØ%(ð)FØ6:¸T±kð)FØ]eÐhlÑ]lð)Fà	ð)Fð )Fð )Fð )Fð\ .2Ø"&ð	) ð ) à"ð) ð $ d™?ð) ð ˜4‘Kð	) ð
 
Lð) ð ) ð ) ð ) ðVTÀð Tð Tð Tð Tðl!ð !ð !ð !ð
 àaeðIð IØ ðIØ-^ðIà	ðIð Ið Iñ „\ðIð@ Øð1!ð 1! #¨¡*ð 1!¸¸T¼
ð 1!ð 1!ð 1!ñ „Yñ „\ð1!ð 1!ð 1!r(   r?   )r;   r¿   r0   r®   r    Úcollections.abcr   Ú	functoolsr   Útypingr   Úhuggingface_hubr   r   r€   r   r	   Úutilsr   r   r   r   r   r   r   Ú
get_loggerr8   r4   r   r?   r=   r(   r&   ú<module>r     s�  ððð ð €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà Ð Ð Ð Ð Ð Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hð ð VØUÐUÐUÐUÐUÐUÐUÐUÐUÐUð 
ˆÔ	˜HÑ	%Ô	%€ð/uð /uð /uð /uð /uñ /uô /uð /uðdT!ð T!ð T!ð T!ð T!ñ T!ô T!ð T!ð T!ð T!r(   