o
    )i&-                  	   @   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
 d dlmZ d dlmZ d dlmZmZmZmZmZmZ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!eG dd dZ"eG dd d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)	dataclass)
HTTPStatus)OptionalUnion)ModelConfig)EngineClient)	ErrorInfoErrorResponseLoadLoRAAdapterRequest	ModelCard	ModelListModelPermissionUnloadLoRAAdapterRequest)init_logger)LoRARequest)LoRAResolverLoRAResolverRegistry)AtomicCounterc                   @   s   e Zd ZU eed< eed< dS )BaseModelPathname
model_pathN)__name__
__module____qualname__str__annotations__ r   r   r/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/entrypoints/openai/serving_models.pyr      s   
 r   c                   @   s.   e Zd ZU eed< eed< dZee ed< dS )LoRAModulePathr   pathNbase_model_name)r   r   r   r   r   r"   r   r   r   r   r   r       s   
 r    c                       s  e Zd ZdZdddededee deee	  f fdd	Z
d
d ZdefddZd!dee defddZdefddZ	d!dedee deeef fddZdedeeef fddZdedee fddZdedee fddZdedeeef 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model_configbase_model_pathsr$   c                   sn   t    || _|j| _|| _|| _|| _i | _td| _	g | _
t D ]}| j
t| q$tt| _d S )Nr   )super__init__r'   max_model_lenr%   r&   static_lora_moduleslora_requestsr   lora_id_counterlora_resolversr   Zget_supported_resolversappendZget_resolverr   r   lora_resolver_lock)selfr%   r&   r'   r$   Zlora_resolver_name	__class__r   r   r)   /   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)requestr"   )r+   r   r!   r   load_lora_adapterr"   
isinstancer   
ValueErrorerrormessage)r1   loraZload_requestZload_resultr   r   r   init_static_lorasJ   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)r   ).0model
model_namer   r   	<genexpr>X   s    z4OpenAIServingModels.is_base_model.<locals>.<genexpr>)anyr'   )r1   rC   r   rB   r   is_base_modelW   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   )r5   r'   r   )r1   rG   r   r   r   rC   Z   s   zOpenAIServingModels.model_namec                    sB    fdd j D } fdd j D }|| t|dS )zMShow 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   r   r*   r   r   )r@   Z
base_modelr1   r   r   
<listcomp>i   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   )rH   rI   parentrJ   )r   r5   Z
local_pathr"   r'   r   r   )r@   r<   rK   r   r   rL   p   s    
)data)r'   r,   valuesextendr   )r1   Zmodel_cardsZ
lora_cardsr   rK   r   show_available_modelsf   s   



z)OpenAIServingModels.show_available_modelsr6   r"   c                    sX  |j }| j| 4 I d H  | |I d H }|d ur&|W  d   I d H  S |j}| jd}t|||d}|d urB| |rB||_z| j	
|I d H  W n5 ty } z)d}	tj}
dt|v red}	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   )r5   lora_int_idr4   BadRequestErrorzNo adapter foundNotFoundErrorr;   err_typestatus_codez-Loaded new LoRA adapter: name '%s', path '%s'Success: LoRA adapter 'z' added successfully.)r5   r0    _check_load_lora_adapter_requestr4   r-   incr   rF   r"   r%   add_lora	Exceptionr   BAD_REQUESTr   	NOT_FOUNDcreate_error_responser,   loggerinfo)r1   r6   r"   r5   error_check_retr4   	unique_idrG   eZ
error_typerX   r   r   r   r7   {   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'rY   z' removed successfully.)r5   r0   "_check_unload_lora_adapter_requestr,   ra   rb   )r1   r6   r5   rc   r   r   r   unload_lora_adapter   s   

0z'OpenAIServingModels.unload_lora_adapterc                    sH   |j r|jstddtjd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.InvalidUserInputrV   The lora adapter 'z' has already been loaded.)r5   r4   r`   r   r^   r,   r1   r6   r   r   r   rZ      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.rh   rV   ri   z' cannot be found.rU   )r5   r`   r   r^   r,   r_   rj   r   r   r   rf      s   z6OpenAIServingModels._check_unload_lora_adapter_requestr5   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.
        NrR   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.rT   rV   zLoRA adapter z does not existrU   )r0   r,   r&   rA   r-   r[   r.   resolve_lorarS   r%   r\   ra   rb   r3   r   BaseExceptionwarningr`   r   r^   r_   )r1   r5   r"   rd   Zfound_adapterresolverrG   re   r   r   r   rk      s^   




)
0z OpenAIServingModels.resolve_lorar?   )r   r   r   __doc__r	   r   listr   r   r    r)   r=   boolrF   r   r   rC   r   rQ   r   r   r   r7   r   rg   rZ   rf   rk   __classcell__r   r   r2   r   r#   &   sX    


+




r#   rT   r;   rW   rX   r>   c                 C   s   t t| ||jddS )N)r;   typecode)r:   )r   r
   valuerV   r   r   r   r`     s   
r`   N)(asyncior   collectionsr   dataclassesr   httpr   typingr   r   Zvllm.configr   Zvllm.engine.protocolr	   Z vllm.entrypoints.openai.protocolr
   r   r   r   r   r   r   Zvllm.loggerr   Zvllm.lora.requestr   Zvllm.lora.resolverr   r   Z
vllm.utilsr   r   ra   r   r    r#   r^   r   r`   r   r   r   r   <module>   s<   $ x