o
    )i                     @   s   d dl mZ d dlmZ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mZmZ d d
lmZ d dlmZ d dlmZ d dl m!Z! ee"Z#G dd deZ$eG dd dZ%dS )    )	dataclass)AnyFinalOptionalUnionN)Request)ModelConfig)EngineClient)ChatTemplateContentFormatOption)RequestLogger)DetokenizeRequestDetokenizeResponseErrorResponseTokenizeChatRequestTokenizeRequestTokenizeResponseTokenizerInfoResponse)OpenAIServing)OpenAIServingModels)init_logger)AnyTokenizerc                       s   e Zd Zdedededee dee de	ddf fd	d
Z
dededeeef fddZdededeeef fddZdeeef fddZ  ZS )OpenAIServingTokenizationengine_clientmodel_configmodelsrequest_loggerchat_templatechat_template_content_formatreturnNc                   s$   t  j||||d || _|| _d S )N)r   r   r   r   )super__init__r   r   )selfr   r   r   r   r   r   	__class__ x/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/entrypoints/openai/serving_tokenization.pyr    !   s   

z"OpenAIServingTokenization.__init__requestraw_requestc                    s  |  |I d H }|d ur|S d| | }zT| |}| j|I d H }t|trZ|jd u r2d ndd |jD }| j|||j	||j
pF| j
| j|j|j|j|jd
I d H \}}	}
n| j|||j|jdI d H \}	}
W n& tttjfy } ztd | | d|j W  Y d }~S d }~ww g }t|
D ]\}}| j||	| d |d t|trd	|v r||d	  qd }|jr||}t ||t!|| j"d
S )Ntokn-c                 S   s   g | ]}|  qS r$   )Z
model_dump).0Ztoolr$   r$   r%   
<listcomp>E   s    z=OpenAIServingTokenization.create_tokenize.<locals>.<listcomp>)
tool_dictsr   r   add_generation_promptcontinue_final_messagechat_template_kwargsadd_special_tokens)r/   z$Error in preprocessing prompt inputs paramslora_requestZprompt_token_ids)tokens
token_strscountmax_model_len)#_check_model_base_request_id_maybe_get_adaptersr   get_tokenizer
isinstancer   ZtoolsZ_preprocess_chatmessagesr   r   r,   r-   r.   r/   Z_preprocess_completionprompt
ValueError	TypeErrorjinja2ZTemplateErrorlogger	exceptioncreate_error_response	__cause__	enumerate_log_inputsdictextendZreturn_token_strsZconvert_ids_to_tokensr   lenr7   )r!   r&   r'   error_check_ret
request_idr3   	tokenizerr+   _Zrequest_promptsZengine_promptseZ	input_idsiZengine_promptr5   r$   r$   r%   create_tokenize3   s   





"
z)OpenAIServingTokenization.create_tokenizec           	         s   |  |I d H }|d ur|S d| | }| |}| j|I d H }| j||jd |d | |||jI d H }|d }t|dS )Nr(   r1   r>   )r>   )	r8   r9   r:   r   r;   rG   r4   Z_tokenize_prompt_input_asyncr   )	r!   r&   r'   rK   rL   r3   rM   Zprompt_inputZ
input_textr$   r$   r%   create_detokenizew   s&   


z+OpenAIServingTokenization.create_detokenizec              
      sl   z| j  I dH }t|| j }tdi |W S  ty5 } z| dt| W  Y d}~S d}~ww )z(Get comprehensive tokenizer information.NzFailed to get tokenizer info: r$   )	r   r;   TokenizerInfor   to_dictr   	ExceptionrD   str)r!   rM   inforO   r$   r$   r%   get_tokenizer_info   s   z,OpenAIServingTokenization.get_tokenizer_info)__name__
__module____qualname__r	   r   r   r   r   rV   r
   r    r   r   r   r   r   rQ   r   r   rR   r   rX   __classcell__r$   r$   r"   r%   r      sB    	

D


r   c                   @   sV   e Zd ZU eed< ee ed< deeef fddZ	deeef fddZ
dd	 Zd
S )rS   rM   r   r   c                 C   s   |   S )z#Return the tokenizer configuration.)_get_tokenizer_configr!   r$   r$   r%   rT      s   zTokenizerInfo.to_dictc                 C   s\   t t| jddp	i }|dd |dd | |}t| jj|d< | jr,| j|d< |S )z?Get tokenizer configuration directly from the tokenizer object.Zinit_kwargsNZ
vocab_fileZmerges_fileZtokenizer_classr   )rH   getattrrM   pop_make_json_serializabletyperY   r   )r!   configr$   r$   r%   r]      s   

z#TokenizerInfo._get_tokenizer_configc                    sP   t |dr|jS t|tr fdd| D S t|tr& fdd|D S |S )zAConvert any non-JSON-serializable objects to serializable format.contentc                    s   i | ]
\}}|  |qS r$   ra   )r)   kvr^   r$   r%   
<dictcomp>   s    z9TokenizerInfo._make_json_serializable.<locals>.<dictcomp>c                    s   g | ]}  |qS r$   re   )r)   itemr^   r$   r%   r*      s    z9TokenizerInfo._make_json_serializable.<locals>.<listcomp>)hasattrrd   r<   rH   itemslist)r!   objr$   r^   r%   ra      s   


z%TokenizerInfo._make_json_serializableN)rY   rZ   r[   r   __annotations__r   rV   rH   r   rT   r]   ra   r$   r$   r$   r%   rS      s   
 rS   )&dataclassesr   typingr   r   r   r   rA   Zfastapir   Zvllm.configr   Zvllm.engine.protocolr	   Zvllm.entrypoints.chat_utilsr
   Zvllm.entrypoints.loggerr   Z vllm.entrypoints.openai.protocolr   r   r   r   r   r   r   Z&vllm.entrypoints.openai.serving_enginer   Z&vllm.entrypoints.openai.serving_modelsr   Zvllm.loggerr   Z!vllm.transformers_utils.tokenizerr   rY   rB   r   rS   r$   r$   r$   r%   <module>   s$   $ 