o
    -it.                  	   @   s   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	m
Z
mZmZmZ d dlmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ d dlmZ eeZ G dd dZ!dej"fde#de#dede
fddZ$dS )    )Lock)defaultdict)
HTTPStatus)EngineClient)	ErrorInfoErrorResponse	ModelCard	ModelListModelPermission)BaseModelPathLoRAModulePath)LoadLoRAAdapterRequestUnloadLoRAAdapterRequest)sanitize_message)init_logger)LoRARequest)LoRAResolverLoRAResolverRegistry)AtomicCounterc                       s   e Zd ZdZdddedee dee dB f fddZd	d
 Z	de
fddZd dedB defddZdefddZ	d dededB deeB fddZdedeeB fddZdededB fddZdededB fddZdedeeB fddZ  ZS )!OpenAIServingModelszShared instance to hold data about the loaded base model(s) and adapters.

    Handles the routes:
    - /v1/models
    - /v1/load_lora_adapter
    - /v1/unload_lora_adapter
    N)lora_modulesengine_clientbase_model_pathsr   c                   s   t    || _|| _|| _i | _td| _g | _t	
 D ]}| jt	| qtt| _| jj| _| jj| _| jj| _| jj| _| jj| _d S )Nr   )super__init__r   r   static_lora_moduleslora_requestsr   lora_id_counterlora_resolversr   get_supported_resolversappendget_resolverr   r   lora_resolver_lockinput_processorio_processorrenderermodel_configmax_model_len)selfr   r   r   lora_resolver_name	__class__ c/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/entrypoints/openai/models/serving.pyr   '   s"   






zOpenAIServingModels.__init__c                    s\   | j du rdS | j D ] }t|j|jd}| j||jdI dH }t|tr+t|j	j
qdS )zALoads all static LoRA modules.
        Raises if any fail to loadN)	lora_path	lora_name)requestbase_model_name)r   r   pathnameload_lora_adapterr1   
isinstancer   
ValueErrorerrormessage)r(   loraload_requestload_resultr,   r,   r-   init_static_lorasD   s   


z%OpenAIServingModels.init_static_lorasreturnc                    s   t  fdd| jD S )Nc                 3   s    | ]}|j  kV  qd S N)r3   ).0model
model_namer,   r-   	<genexpr>T   s    z4OpenAIServingModels.is_base_model.<locals>.<genexpr>)anyr   )r(   rB   r,   rA   r-   is_base_modelS   s   z!OpenAIServingModels.is_base_modellora_requestc                 C   s   |dur|j S | jd jS )a&  Returns the appropriate model name depending on the availability
        and support of the LoRA or base model.
        Parameters:
        - lora: LoRARequest that contain a base_model_name.
        Returns:
        - str: The name of the base model or the first available model path.
        Nr   )r/   r   r3   )r(   rF   r,   r,   r-   rB   V   s   zOpenAIServingModels.model_namec                    sB    fdd j D } fdd j D }|| t|dS )zLShow available models. This includes the base model and all
        adaptersc                    s&   g | ]}t |j j|jt gd qS ))idr'   root
permission)r   r3   r'   
model_pathr
   )r?   
base_modelr(   r,   r-   
<listcomp>e   s    z=OpenAIServingModels.show_available_models.<locals>.<listcomp>c                    s8   g | ]}t |j|j|jr|jn jd  jt gdqS )r   )rG   rH   parentrI   )r   r/   r2   r1   r   r3   r
   )r?   r9   rL   r,   r-   rM   n   s    	
)data)r   r   valuesextendr	   )r(   model_cards
lora_cardsr,   rL   r-   show_available_modelsb   s   

		

z)OpenAIServingModels.show_available_modelsr0   r1   c                    sr  |j }| j| 4 I d H  | |I d H }|d ur&|W  d   I d H  S |j}|| jv r4| j| jn| jd}t||||j	d}|d urO| 
|rO||_z| j|I d H  W n5 ty } z)d}	tj}
dt|v rrd}	tj}
tt||	|
dW  Y d }~W  d   I d H  S d }~ww || j|< td|| d| d	W  d   I d H  S 1 I d H sw   Y  d S )
N   )r/   lora_int_idr.   load_inplaceBadRequestErrorzNo adapter foundNotFoundErrorr8   err_typestatus_codez-Loaded new LoRA adapter: name '%s', path '%s'Success: LoRA adapter 'z' added successfully.)r/   r"    _check_load_lora_adapter_requestr.   r   rV   r   incr   rW   rE   r1   r   add_lora	Exceptionr   BAD_REQUESTstr	NOT_FOUNDcreate_error_responseloggerinfo)r(   r0   r1   r/   error_check_retr.   rV   rF   e
error_typer\   r,   r,   r-   r4   |   sP   




0z%OpenAIServingModels.load_lora_adapterc              	      s   |j }| j| 4 I d H 3 | |I d H }|d ur&|W  d   I d H  S | j|= td| d| dW  d   I d H  S 1 I d H sFw   Y  d S )NzRemoved LoRA adapter: name '%s'r]   z' removed successfully.)r/   r"   "_check_unload_lora_adapter_requestr   rf   rg   )r(   r0   r/   rh   r,   r,   r-   unload_lora_adapter   s   
0z'OpenAIServingModels.unload_lora_adapterc                    sN   |j r|jstddtjdS |js%|j | jv r%td|j  ddtjdS d S )Nz2Both 'lora_name' and 'lora_path' must be provided.InvalidUserInputrZ   The lora adapter 'z`' has already been loaded. If you want to load the adapter in place, set 'load_inplace' to True.)r/   r.   re   r   rb   rW   r   r(   r0   r,   r,   r-   r^      s   z4OpenAIServingModels._check_load_lora_adapter_requestc                    sB   |j stddtjdS |j | jvrtd|j  ddtjdS d S )Nz:'lora_name' needs to be provided to unload a LoRA adapter.rm   rZ   rn   z' cannot be found.rY   )r/   re   r   rb   r   rd   ro   r,   r,   r-   rk      s   z6OpenAIServingModels._check_unload_lora_adapter_requestr/   c                    s  | j | 4 I dH  || jv r| j| W  d  I dH  S | jj}| jd}d}| jD ]W}|||I dH }|durd}||_z&| j	
|I dH  || j|< td||jj |W   W  d  I dH  S  ty } ztd||jj| W Y d}~q.d}~ww q.|rtd| dd	tjd
W  d  I dH  S td| ddtjd
W  d  I dH  S 1 I dH sw   Y  dS )ad  Attempt to resolve a LoRA adapter using available resolvers.

        Args:
            lora_name: Name/identifier of the LoRA adapter

        Returns:
            LoRARequest if found and loaded successfully.
            ErrorResponse (404) if no resolver finds the adapter.
            ErrorResponse (400) if adapter(s) are found but none load.
        NrU   FTz.Resolved and loaded LoRA adapter '%s' using %szBFailed to load LoRA '%s' resolved by %s: %s. Trying next resolver.zLoRA adapter 'z$' was found but could not be loaded.rX   rZ   zLoRA adapter z does not existrY   )r"   r   r&   r@   r   r_   r   resolve_lorarV   r   r`   rf   rg   r+   __name__BaseExceptionwarningre   r   rb   rd   )r(   r/   r1   	unique_idfound_adapterresolverrF   ri   r,   r,   r-   rp      s^   



/
0z OpenAIServingModels.resolve_lorar>   )rq   
__module____qualname____doc__r   listr   r   r   r<   boolrE   r   rc   rB   r	   rT   r   r   r4   r   rl   r^   rk   rp   __classcell__r,   r,   r*   r-   r      sL    

/


r   rX   r8   r[   r\   r=   c                 C   s   t tt| ||jddS )N)r8   typecode)r7   )r   r   r   valuerZ   r,   r,   r-   re   )  s   re   N)%asyncior   collectionsr   httpr   vllm.engine.protocolr   'vllm.entrypoints.openai.engine.protocolr   r   r   r	   r
   'vllm.entrypoints.openai.models.protocolr   r   $vllm.entrypoints.serve.lora.protocolr   r   vllm.entrypoints.utilsr   vllm.loggerr   vllm.lora.requestr   vllm.lora.resolverr   r   vllm.utils.counterr   rq   rf   r   rb   rc   re   r,   r,   r,   r-   <module>   s6     