o
    )iQ                     @   s   d dl mZ d dlmZmZm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mZmZmZmZmZ d d
l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&G dd deZ'G dd de'Z(dS )    )
HTTPStatus)OptionalUnioncastN)Request)override)ModelConfig)EngineClient)RequestLogger)ClassificationDataClassificationRequestClassificationResponseErrorResponse	UsageInfo)ClassificationServeContextOpenAIServingServeContext)OpenAIServingModels)init_logger)ClassificationOutputPoolingRequestOutput)PoolingParamsc                   @   sD   e Zd Zededee fddZededee	ef fddZ
dS )ClassificationMixinctxreturnc              
      s   t t|}t|jjtr|jjs| jdtjdS t|jjt	r*t
|jjdkr*dS z+| |j|_| j|jI dH |_| j|j|j|jj|jjdI dH \|_|_W dS  ttfyu } ztd | t|W  Y d}~S d}~ww )z|
        Process classification inputs: tokenize text, resolve adapters,
        and prepare model-specific inputs.
        z(Input cannot be empty for classification)status_coder   N)truncate_prompt_tokensz$Error in preprocessing prompt inputs)r   r   
isinstancerequestinputstrcreate_error_responser   BAD_REQUESTlistlenZ_maybe_get_adaptersZlora_requestengine_clientZget_tokenizerZ	tokenizerZ_preprocess_completionr   Zrequest_promptsZengine_prompts
ValueError	TypeErrorlogger	exception)selfr   e r,   z/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/entrypoints/openai/serving_classification.py_preprocess    s:   
	

zClassificationMixin._preprocessc                 C   s   t t|}g }d}t tt |j}t|D ]7\}}t|j}|j	}t
t|}	t| jjdi |	}
t||
|t|d}|| |j}|t|7 }qt||d}t|j|j|j||dS )zu
        Convert model outputs to a formatted classification response
        with probabilities and labels.
        r   Zid2label)indexlabelprobsZnum_classes)Zprompt_tokensZtotal_tokens)idcreatedmodeldatausage)r   r   r#   r   Zfinal_res_batch	enumerater   Z	from_baseZoutputsr1   intnpZargmaxgetattrmodel_configZ	hf_configgetr   r$   appendprompt_token_idsr   r   
request_idZcreated_time
model_name)r*   r   itemsZnum_prompt_tokensZfinal_res_batch_checkedidxZ	final_resZclassify_resr1   Zpredicted_indexr0   itemr>   r6   r,   r,   r-   _build_responseI   sF   
	

z#ClassificationMixin._build_responseN)__name__
__module____qualname__r   r   r   r   r.   r   r   rD   r,   r,   r,   r-   r      s    (
r   c                
       s   e Zd ZdZdedededee ddf
 fdd	Z	d
e
dedeeef f fddZededee f fddZededeeef f fddZ  ZS )ServingClassificationclassifyr%   r;   modelsrequest_loggerr   Nc                   s   t  j||||d d S )N)r%   r;   rJ   rK   )super__init__)r*   r%   r;   rJ   rK   	__class__r,   r-   rM   }   s   
zServingClassification.__init__r   raw_requestc                    sF   |  |j}| j d| | }t||||d}t |I d H S )N-)r   rP   r@   r?   )Z_get_model_namer4   request_id_prefixZ_base_request_idr   rL   handle)r*   r   rP   r@   r?   r   rN   r,   r-   create_classify   s   z%ServingClassification.create_classifyr   c                    s"   t  | }r
|S |jj|_d S )N)rL   _validate_requestr   r   )r*   r   errorrN   r,   r-   rU      s   
z'ServingClassification._validate_requestc              
      sb   t  |}t|tr|S z
|d| j W |S  ty0 } z| t|W  Y d }~S d }~ww )NrI   )	rL   _create_pooling_paramsr   r   verifyr;   r&   r!   r    )r*   r   Zpooling_paramsr+   rN   r,   r-   rW      s   
z,ServingClassification._create_pooling_params)rE   rF   rG   rR   r	   r   r   r   r
   rM   r   r   r   r   r   rT   r   r   rU   r   rW   __classcell__r,   r,   rN   r-   rH   z   s@    

rH   ))httpr   typingr   r   r   numpyr9   Zfastapir   Ztyping_extensionsr   Zvllm.configr   Zvllm.engine.protocolr	   Zvllm.entrypoints.loggerr
   Z vllm.entrypoints.openai.protocolr   r   r   r   r   Z&vllm.entrypoints.openai.serving_enginer   r   r   Z&vllm.entrypoints.openai.serving_modelsr   Zvllm.loggerr   Zvllm.outputsr   r   Zvllm.pooling_paramsr   rE   r(   r   rH   r,   r,   r,   r-   <module>   s"   \