
    .`i                         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e          Zd	S )
    )Sequence)PreTrainedTokenizerBase)ChatCompletionRequest)DeltaMessage)init_logger)BaseThinkingReasoningParserc                       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	            Z
e	defd
            Zdef fdZdedededee         dee         dee         dedz  fdZdededeedz  edz  f         f fdZ x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                     dS )z(The token that starts reasoning content.z<think> selfs    {/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/reasoning/ernie45_reasoning_parser.pystart_tokenz"Ernie45ReasoningParser.start_token   s	     y    c                     dS )z&The token that ends reasoning content.z</think>r   r   s    r   	end_tokenz Ernie45ReasoningParser.end_token#   s	     zr   	tokenizerc                 6    t                      j        |g|R i | | j        st          d          | j                            | j                  | _        | j                            | j                  | _	        | j                            | j
                  | _        | j                            | j                  | _        | j                            | j                  | _        | j	        | j        g| _        | j        | j	        t#          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__s       r   r   zErnie45ReasoningParser.__init__(   s   4T444V444# 	3  
 #jnnT-=>> JNN4>::'+z~~d6O'P'P$%)Z^^D4K%L%L" $
t/A B B!%!2D4N O&$*;*C+   +D*Cr   previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                 6   t          |          dk    r$|d         | j        | j        | j        | j        fv rdS | j        |v r|                    | j                  }|d|         }||t          | j                  z   d         }	|	                    d          }	|	                    | j                  }
|		                    | j
                  }|
dk    r|	|
t          | j                  z   d         }	|dk    r
|	d|         }	t          ||	r|	nd          S | j        |v rj|}	| j        |v ry|	                    d          }	|	                    | j                  }
|	|
t          | j                  z   d         }	|		                    | j
                  }|dk    r
|	d|         }	n-| j        |v r$|		                    | j
                  }|	d|         }	|d         | j        v r9t          |          dk    r&|d         | j        k    r|	                    d          }	t          |          dk    rJ|d         | j        k    r9t          |          dk    r&|d         | j        k    r|	                    d          }	t          |	r|	nd          S t          |	          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)r5   )r4   )lenr    r!   r"   r#   findr   lstripr   rfindr   r   r%   r$   )r   r*   r+   r,   r-   r.   r/   think_end_indexr4   r5   response_start_idxresponse_end_idxs               r   extract_reasoning_streamingz2Ernie45ReasoningParser.extract_reasoning_streaming?   s   ( 1$$A#!,*	  4 // )oodn==O"#3O#34I 3t~3F3F!F!H!HIGnnT**G!(d.G!H!H&}}T-DEE!R''!"4s4;T7U7U"U"W"WX2%%!"3#3"34##*4    "444 G+>>!....%,\\$2K%L%L"!"4s4;T7U7U"U"W"WX#*==1H#I#I #r))%&7'7&78G+>>#*==1H#I#I !"3#3"34!"%)>>>O$$q((_Q-?4CX-X-X!.... &''!++&r*d.???O$$q((_Q-?4CX-X-X!....7(DEEEE  *5555r   model_outputrequestc                 ,   t                                          ||          \  }}|re|                    | j                  }|                    | j                  }|dk    r+|dk    r%||k     r||t          | j                  z   |         }|pd}||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
        r3   N)r   extract_reasoningr8   r   r:   r   r7   )	r   r?   r@   r4   r5   	start_idxend_idxfinal_contentr)   s	           r   rB   z(Ernie45ReasoningParser.extract_reasoning   s     #WW66|WMM	7 	XT%>??ImmD$;<<GB7b==Y5H5H!)c$2K.L.L"Lw"VW4-''r   )__name__
__module____qualname____doc__r   str__annotations__r   r   propertyr   r   r   r   r   intr   r>   r   tuplerB   __classcell__)r)   s   @r   r
   r
      s          !-#,,,++++!M3!!!S    X 3    X"9      .Q6Q6 Q6 	Q6
 %SMQ6 $C=Q6 "#Q6 
	Q6 Q6 Q6 Q6f((*?(	sTz3:%	&( ( ( ( ( ( ( ( ( (r   r
   N)collections.abcr   transformersr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   vllm.loggerr   vllm.reasoning.basic_parsersr   rF   loggerr
   r   r   r   <module>rW      s    % $ $ $ $ $ 0 0 0 0 0 0      A @ @ @ @ @ # # # # # # D D D D D D	X		V( V( V( V( V(8 V( V( V( V( V(r   