o
    ie                     @   s   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 d dlmZ e	eZG d	d
 d
eZG dd deZdS )    )Sequence)ChatCompletionRequest)DeltaMessage)ResponsesRequest)init_logger)ReasoningParser)BaseThinkingReasoningParser)TokenizerLikec                   @   sj   e Zd ZdZedefddZede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S )MiniMaxM2ReasoningParserz
    Reasoning parser for MiniMax M2 model.

    MiniMax M2 models don't generate <think> start token, only </think> end
    token. All content before </think> is reasoning, content after is the
    actual response.
    returnc                 C      dS )z(The token that starts reasoning content.<think> selfr   r   `/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/reasoning/minimax_m2_reasoning_parser.pystart_token       z$MiniMaxM2ReasoningParser.start_tokenc                 C   r   )z&The token that ends reasoning content.</think>r   r   r   r   r   	end_token%   r   z"MiniMaxM2ReasoningParser.end_tokenprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc           
      C   s   t |dkr|d | jkrdS | j|v rt|dS | j|v rE|| j}|d| }||t | j d }	t|r:|nd|	rA|	dS ddS t|dS )z
        Extract reasoning content from a delta message for streaming.

        MiniMax M2 models don't generate <think> start token, so we assume
        all content is reasoning until we encounter the </think> end token.
           r   Ncontent)	reasoningr   )r   )lenend_token_idr   findr   )
r   r   r   r   r   r   r   	end_indexr   r   r   r   r   extract_reasoning_streaming*   s   




z4MiniMaxM2ReasoningParser.extract_reasoning_streaming)__name__
__module____qualname____doc__propertystrr   r   r   intr   r$   r   r   r   r   r
      s*    r
   c                       s   e Zd ZdZd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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eB deedB edB f fddZ  ZS )#MiniMaxM2AppendThinkReasoningParserz0
    Reasoning parser for MiniMax M2 model.
    	tokenizerc                    s,   t  j|g|R i | | jd| _d S )Nr   )super__init__vocabgetr!   )r   r-   argskwargs	__class__r   r   r/   W   s   z,MiniMaxM2AppendThinkReasoningParser.__init__	input_idsr   c                    s    | j  t fddt|D S )Nc                 3   s    | ]}| kV  qd S Nr   ).0input_idr!   r   r   	<genexpr>]   s    zGMiniMaxM2AppendThinkReasoningParser.is_reasoning_end.<locals>.<genexpr>)r!   anyreversedr   r6   r   r:   r   is_reasoning_end[   s   z4MiniMaxM2AppendThinkReasoningParser.is_reasoning_endc                 C   s   |S r7   r   r>   r   r   r   extract_content_ids_   s   z7MiniMaxM2AppendThinkReasoningParser.extract_content_idsr   r   r   r   r   r   Nc                 C   s   t |dkr
d| }t|dS )Nr   r   r   )r    r   )r   r   r   r   r   r   r   r   r   r   r$   b   s   	
z?MiniMaxM2AppendThinkReasoningParser.extract_reasoning_streamingmodel_outputrequestc                 C   s   d d| fS )Nr   r   )r   rA   rB   r   r   r   extract_reasoningo   s   z5MiniMaxM2AppendThinkReasoningParser.extract_reasoning)r%   r&   r'   r(   r	   r/   r   r+   boolr?   listr@   r*   r   r$   r   r   tuplerC   __classcell__r   r   r4   r   r,   R   s6    
r,   N)collections.abcr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   *vllm.entrypoints.openai.responses.protocolr   vllm.loggerr   $vllm.reasoning.abs_reasoning_parsersr   vllm.reasoning.basic_parsersr   vllm.tokenizersr	   r%   loggerr
   r,   r   r   r   r   <module>   s   ;