o
    )i2,                     @   s   d dl mZmZ d dl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 d d
lmZmZmZ d dlmZ eeZeejedkZdZG dd dZG dd deeZG dd deZG dd deZ dS )    )ABCabstractmethod)OptionalN)version)	Tokenizer)DecodeStream)PreTrainedTokenizerFast)StopChecker)init_logger)AnyTokenizerconvert_prompt_ids_to_tokensdetokenize_incrementally)EngineCoreRequestz0.21.1zInvalid prefix encounteredc                   @   s|   e Zd Zdd Zedee fddZdee dede	e
 fdd	Zd
edede
fddZede	e dedd fddZdS )IncrementalDetokenizerc                 C   s
   g | _ d S N	token_idsself r   f/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/v1/engine/detokenizer.py__init__   s   
zIncrementalDetokenizer.__init__returnc                 C   s   | j S r   r   r   r   r   r   output_token_ids"   s   z'IncrementalDetokenizer.output_token_idsnew_token_idsstop_terminatedc                 C   s   | j | d S r   )r   extend)r   r   r   r   r   r   update&   s   zIncrementalDetokenizer.updatefinisheddeltac                 C   s   dS N r   )r   r   r   r   r   r   get_next_output_text+   s   z+IncrementalDetokenizer.get_next_output_text	tokenizerrequestc                 C   s>   |j d usJ |d u rt S trt|trt||S t||S r   )sampling_paramsr   USE_FAST_DETOKENIZER
isinstancer   FastIncrementalDetokenizerSlowIncrementalDetokenizer)clsr#   r$   r   r   r   from_new_request.   s   

z'IncrementalDetokenizer.from_new_requestN)__name__
__module____qualname__r   propertylistintr   boolr   strr   r"   classmethodr   r   r+   r   r   r   r   r      s$    

r   c                       sl   e Zd Zdef fddZdee dedee	 fddZ
ed	ede	fd
dZdedede	fddZ  ZS )BaseIncrementalDetokenizerr$   c                    sr   t    |j}|d usJ |j | _}|j| _|j| _|r.| js.tdd |D d | _nd| _d| _d| _	d S )Nc                 s   s    | ]}t |V  qd S r   )len).0sr   r   r   	<genexpr>S   s    z6BaseIncrementalDetokenizer.__init__.<locals>.<genexpr>   r   r!   )
superr   r%   stop
min_tokensinclude_stop_str_in_outputmaxstop_buffer_length_last_output_text_offsetoutput_text)r   r$   paramsr<   	__class__r   r   r   F   s   


z#BaseIncrementalDetokenizer.__init__r   r   r   c           	      C   s  |sdS |r| j s|d }|dd }nd}t| j}|D ]"}| j| |  j| |7  _| jr?t| j| jkr?t| j}q|rN|durL| j| dS d}| jrt| j| jkrt	j
| jt| j| | j| j d}|dur|\}}|dkr| jd| | _|S )z
        Update RequestState for the request_id by:
            1) Detokenize the new token ids incrementally.
            2) Evaluate stop criteria.

        Return matched stop string or None.
        N)rB   Znew_char_countr<   Zinclude_in_output)r>   r6   rB   r   appenddecode_nextr=   r   r<   r	   Zcheck_stop_strings)	r   r   r   Zskipped_stop_token_idZstop_check_offsetZnew_token_idZstop_stringr<   Ztruncate_tor   r   r   r   [   sD   	


z!BaseIncrementalDetokenizer.updatenext_token_idc                 C   s   t r   )NotImplementedError)r   rI   r   r   r   rH      s   z&BaseIncrementalDetokenizer.decode_nextr   r   c                 C   s`   |rdn| j }|s|r| jd|  S | jS t| j| }| j}||k r.|| _| j|| S dS )zVIf delta is True, only new text since the last call to
        this method is returnedr   Nr!   )r@   rB   r6   rA   )r   r   r   Zbuffer_lengthlengthZlast_offsetr   r   r   r"      s   z/BaseIncrementalDetokenizer.get_next_output_text)r,   r-   r.   r   r   r0   r1   r2   r   r3   r   r   rH   r"   __classcell__r   r   rD   r   r5   D   s    

8r5   c                       sN   e Zd Zdedef fddZdedefddZdede	e fd	d
Z
  ZS )r(   r#   r$   c           
         s  t  | |j}|d usJ |j| _|j| _t| jd| _|j| _|j	}t
|}|dkrNtdt|d dD ]}|j	| d  }d| j|vrM|} nq7|D ]}| | qP|jp]|j| _| jst| jdd  }	d u r}dd | j  D  | j_}	|	rd	| _|	| _d S d
| _d S d S )N)skip_special_tokens   r:      u   �added_token_idsc                 S   s   i | ]\}}||j qS r   )content)r7   tidtokr   r   r   
<dictcomp>   s    z7FastIncrementalDetokenizer.__init__.<locals>.<dictcomp>FT)r;   r   r%   
request_idrM   r   streamZ
_tokenizerr#   prompt_token_idsr6   rangemindecode_protected_stepspaces_between_special_tokensgetattrZget_added_tokens_decoderitemsrP   last_special)
r   r#   r$   r%   Zprompt_suffix
prompt_lenisuffixrR   rP   rD   r   r   r      sJ   

z#FastIncrementalDetokenizer.__init__rI   r   c                 C   s@   |  |}| js| j|}|d u}|r| jr|}|| _|pdS r    )r[   r\   rP   getr_   )r   rI   tokenZspecial_tokenZ
is_specialr   r   r   rH      s   

z&FastIncrementalDetokenizer.decode_nextc              
   C   sx   z| j | j|}W |S  ty; } z$t|tkr|td| j t	| j
| _ | j | j|}W Y d }~|S d }~ww )NzXEncountered invalid prefix detokenization error for request %s, resetting decode stream.)rV   stepr#   	Exceptionr3   INVALID_PREFIX_ERR_MSGloggerwarningrU   r   rM   )r   rI   rd   er   r   r   r[      s   z*FastIncrementalDetokenizer._protected_step)r,   r-   r.   r   r   r   r1   r3   rH   r   r[   rL   r   r   rD   r   r(      s    2r(   c                       sN   e Zd Zdedef fddZedee fddZ	dede
fd	d
Z  ZS )r)   r#   r$   c                    sp   t  | || _|j}|d usJ t||j|jd\| _| _| _	| j
|j t|j| _|j| _|j| _d S )N)r#   Z
prompt_idsrM   )r;   r   r#   r%   r   rW   rM   tokensprefix_offsetread_offsetr   r   r6   r`   r\   )r   r#   r$   rC   rD   r   r   r      s   z#SlowIncrementalDetokenizer.__init__r   c                 C   s   | j s| jS | j| j d  S r   )r`   r   r   r   r   r   r     s   z+SlowIncrementalDetokenizer.output_token_idsrI   c              	   C   sH   t | j| j| j| j| j| j| jd\}}}}| j| || _|| _|S )N)r#   Zall_input_idsZprev_tokensrl   rm   rM   r\   )	r   r#   r   rk   rl   rm   rM   r\   r   )r   rI   Z
new_tokensZdecoded_textrl   rm   r   r   r   rH     s   
z&SlowIncrementalDetokenizer.decode_next)r,   r-   r.   r   r   r   r/   r0   r1   r   r3   rH   rL   r   r   rD   r   r)      s
    r)   )!abcr   r   typingr   Z
tokenizers	packagingr   r   Ztokenizers.decodersr   Ztransformersr   Z)vllm.engine.output_processor.stop_checkerr	   Zvllm.loggerr
   Z)vllm.transformers_utils.detokenizer_utilsr   r   r   Zvllm.v1.enginer   r,   rh   parse__version__r&   rg   r   r5   r(   r)   r   r   r   r   <module>   s,   'dS