o
    i                     @   sd   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 e	eZG dd deZd	S )
    )Sequence)PreTrainedTokenizerBase)ChatCompletionRequest)DeltaMessage)init_logger)BaseThinkingReasoningParserc                       s   e Zd ZU dZdZeed< dZeed< dZeed< e	defd	d
Z
e	defd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 fddZ  ZS )Ernie45ReasoningParserz
    Reasoning parser for Ernie45 thinking model.
    The Ernie45 thinking model ouput format is
        abc
</think>

<response>
def
</response>

    or  abc
</think>
def
    z
<response>response_start_tokenz</response>response_end_tokenz<0x0A>newline_tokenreturnc                 C      dS )z(The token that starts reasoning content.z<think> selfr   r   ]/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/reasoning/ernie45_reasoning_parser.pystart_token      z"Ernie45ReasoningParser.start_tokenc                 C   r   )z&The token that ends reasoning content.z</think>r   r   r   r   r   	end_token#   r   z Ernie45ReasoningParser.end_token	tokenizerc                    s   t  j|g|R i | | jstd| j| j| _| j| j| _	| j| j
| _| j| j| _| j| j| _| j	| jg| _| jd u sM| j	d u rQtdd S )NzZThe model tokenizer must be passed to the ReasoningParser constructor during construction.zRErnie45 reasoning parser could not locate think start/end tokens in the tokenizer!)super__init__model_tokenizer
ValueErrorvocabgetr   start_token_idr   end_token_idr	   response_start_token_idr
   response_end_token_idr   newline_token_idparser_token_idsRuntimeError)r   r   argskwargs	__class__r   r   r   (   s    zErnie45ReasoningParser.__init__previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                 C   s  t |dkr|d | j| j| j| jfv rdS | j|v rh|| j}|d| }||t | j d }	|	d}	|	| j}
|		| j
}|
dkrR|	|
t | j d }	|dkr\|	d| }	t||	rd|	dS ddS | j|v r|}	| j|v r|	d}	|	| j}
|	|
t | j d }	|		| j
}|dkr|	d| }	n| j|v r|		| j
}|	d| }	|d | jv rt |dkr|d | jkr|	d}	t |dkr|d | jkrt |dkr|d | jkr|	d}	t|	r|	dS ddS t|d	S )
az  
        Extract reasoning content from a delta message.
        Handles streaming output where previous + delta = current.
        Uses token IDs for faster processing.
        The Ernie45 thinking model ouput format is
            abc
</think>

<response>
def
</response>

        or  abc
</think>
def
        - 'abc' goes to reasoning
        - 'def' goes to content
           r   N
)	reasoningcontent)r1   )r0   )lenr   r   r   r   findr   lstripr	   rfindr
   r   r!   r    )r   r'   r(   r)   r*   r+   r,   think_end_indexr0   r1   response_start_idxresponse_end_idxr   r   r   extract_reasoning_streaming?   s`   








z2Ernie45ReasoningParser.extract_reasoning_streamingmodel_outputrequestc                    sl   t  ||\}}|r.|| j}|| j}|dkr.|dkr.||k r.||t| j | }|p1d}||fS )ak  
        Extract reasoning content from the model output.
        The Ernie45 thinking model ouput format is
            abc
</think>


<response>
def
</response>

        or  abc
</think>
def
        - 'abc' goes to reasoning
        - 'def' goes to content
        Returns:
            tuple[Optional[str], Optional[str]]: reasoning content and content
        r/   N)r   extract_reasoningr4   r	   r6   r
   r3   )r   r;   r<   r0   r1   	start_idxend_idxfinal_contentr%   r   r   r=      s   z(Ernie45ReasoningParser.extract_reasoning)__name__
__module____qualname____doc__r	   str__annotations__r
   r   propertyr   r   r   r   r   intr   r:   r   tupler=   __classcell__r   r   r%   r   r      s@   
 
Sr   N)collections.abcr   transformersr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   vllm.loggerr   vllm.reasoning.basic_parsersr   rA   loggerr   r   r   r   r   <module>   s   