o
    
۾i                     @   sl   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 eeZG dd	 d	eZdS )
    )SequenceN)PreTrainedTokenizerBase)ChatCompletionRequest)DeltaMessage)init_logger)ReasoningParserc                       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	dB fddZ
dededeedB edB f fddZdee defddZdee 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                    sl   t  j|g|R i | d| _td| j tj| _| js#td| j	
| j| _| jd u r4t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DOTALLreasoning_regexmodel_tokenizer
ValueErrorvocabgetthink_end_token_idRuntimeError)selfr	   argskwargs	__class__ Y/home/ubuntu/.local/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
        - 'xyz' goes to content
           r   N)	reasoningcontent)r'   )r&   )lenr   findr   r   )
r   r   r   r    r!   r"   r#   	end_indexr&   r'   r   r   r   extract_reasoning_streaming.   s   



z0Step3ReasoningParser.extract_reasoning_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_reasoningS   s   
z&Step3ReasoningParser.extract_reasoning	input_idsc                 C   s
   | j |v S Nr   r   r/   r   r   r   is_reasoning_endg   s   
z%Step3ReasoningParser.is_reasoning_end	delta_idsc                 C   s   | j }||v S r0   r1   )r   r/   r4   end_token_idr   r   r   is_reasoning_end_streamingj   s   z/Step3ReasoningParser.is_reasoning_end_streamingc                 C   s.   | j |d d vrg S ||| j d d  S )Nr%   )r   indexr2   r   r   r   extract_content_idsp   s   z(Step3ReasoningParser.extract_content_ids)__name__
__module____qualname____doc__r   r   strr   intr   r+   r   tupler.   boolr3   r6   listr9   __classcell__r   r   r   r   r      sD    
%

"r   )collections.abcr   regexr   transformersr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   vllm.loggerr   vllm.reasoningr   r:   loggerr   r   r   r   r   <module>   s   