o
    )i                     @   s   d dl mZ d dlmZmZ d dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZ eeZedG d	d
 d
eZdS )    )Sequence)OptionalUnionN)PreTrainedTokenizerBase)ChatCompletionRequestDeltaMessage)init_logger)ReasoningParserReasoningParserManagerZstep3c                       s   e Zd ZdZdef fddZdedededee d	ee d
ee de	e
df fddZdededeee ee f fddZdee defddZdee dee fddZ  ZS )Step3ReasoningParserz
    Reasoning parser for Step3 model.

    The Step3 model uses </think> token to denote the end of reasoning 
    text. This parser extracts all content before </think> as reasoning content.
    	tokenizerc                    s^   t  | d| _td| j tj| _| jstd| j	
| j| _| jd u r-tdd S )Nz</think>z(.*?)zZThe model tokenizer must be passed to the ReasoningParser constructor during construction.zIStep3 reasoning parser could not locate think end token in the tokenizer!)super__init__think_end_tokenrecompileDOTALLZreasoning_regexZmodel_tokenizer
ValueErrorZvocabgetthink_end_token_idRuntimeError)selfr   	__class__ q/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/reasoning/step3_reasoning_parser.pyr      s   
zStep3ReasoningParser.__init__previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsreturnNc           
      C   s   t |dkr|d | jkrdS | j|v r7|| j}|d| }||t | j d }	t||	r3|	dS ddS | j|v rAt|dS t|dS )a  
        Extract reasoning content from a delta message.
        Handles streaming output where previous + delta = current.
        Uses token IDs for faster processing.
        For text "abc</think>xyz":
        - 'abc' goes to reasoning_content
        - 'xyz' goes to content
           r   N)reasoning_contentcontent)r%   )r$   )lenr   findr   r   )
r   r   r   r   r   r    r!   	end_indexr$   r%   r   r   r   #extract_reasoning_content_streaming-   s"   



z8Step3ReasoningParser.extract_reasoning_content_streamingmodel_outputrequestc                 C   sX   | j |vr	|d fS || j }|d | }||t| j  d  }t|dkr(d }||fS )Nr   )r   r'   r&   )r   r*   r+   r(   r$   r%   r   r   r   extract_reasoning_contentQ   s   
z.Step3ReasoningParser.extract_reasoning_content	input_idsc                 C   s
   | j |v S )N)r   r   r-   r   r   r   is_reasoning_endf   s   
z%Step3ReasoningParser.is_reasoning_endc                 C   s.   | j |d d vrg S ||| j d d  S )Nr#   )r   indexr.   r   r   r   extract_content_idsi   s   z(Step3ReasoningParser.extract_content_ids)__name__
__module____qualname____doc__r   r   strr   intr   r   r)   r   tupler   r,   listboolr/   r2   __classcell__r   r   r   r   r      s6    

$
"r   )collections.abcr   typingr   r   regexr   Ztransformersr   Z vllm.entrypoints.openai.protocolr   r   Zvllm.loggerr   Zvllm.reasoningr	   r
   r3   loggerZregister_moduler   r   r   r   r   <module>   s   