
    .`i                         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	e          ZdS )
    )SequenceN)PreTrainedTokenizerBase)ChatCompletionRequest)DeltaMessage)init_logger)ReasoningParserc                       e Zd Z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dZdee         d
efdZdee         dee         d
efdZdee         d
ee         fdZ x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                 H    t                      j        |g|R i | d| _        t          j        d| j         t          j                  | _        | j        st          d          | j	        
                    | j                  | _        | j        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DOTALLreasoning_regexmodel_tokenizer
ValueErrorvocabgetthink_end_token_idRuntimeError)selfr   argskwargs	__class__s       y/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/reasoning/step3_reasoning_parser.pyr   zStep3ReasoningParser.__init__   s    4T444V444)!z*I43G*I*I29UU# 	3  
 #'*..1E"F"F"**   +*    previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsreturnNc                 b   t          |          dk    r|d         | j        k    rdS | j        |v rX|                    | j                  }|d|         }||t          | j                  z   d         }	t	          ||	r|	nd          S | j        |v rt	          |          S t	          |          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*   s
             r   extract_reasoning_streamingz0Step3ReasoningParser.extract_reasoning_streaming.   s    $ 1$$);t?V)V)V4"o55"(<==I":I:.I S1E-F-F!F!H!HIG##*4    $(:::
3333  *5555r   model_outputrequestc                     | j         |vr|d fS |                    | j                   }|d |         }||t          | j                   z   d          }t          |          dk    rd }||fS )Nr   )r   r,   r+   )r   r/   r0   r-   r)   r*   s         r   extract_reasoningz&Step3ReasoningParser.extract_reasoningS   s     |33%% %))$*>??I$ZiZ0I #9s43G/H/H#H#J#JKG7||q  g%%r   	input_idsc                     | j         |v S Nr   r   r3   s     r   is_reasoning_endz%Step3ReasoningParser.is_reasoning_endg   s    &)33r   	delta_idsc                     | j         }||v S r5   r6   )r   r3   r9   end_token_ids       r   is_reasoning_end_streamingz/Step3ReasoningParser.is_reasoning_end_streamingj   s     .y((r   c                 r    | j         |d d         vrg S ||                    | j                   dz   d          S )Nr(   )r   indexr7   s     r   extract_content_idsz(Step3ReasoningParser.extract_content_idsp   sB    ")CRC.88IY__T-DEEIKKLLr   )__name__
__module____qualname____doc__r   r   strr   intr   r.   r   tupler2   boolr8   r<   listr@   __classcell__)r   s   @r   r
   r
      s        "9      &#6#6 #6 	#6
 %SM#6 $C=#6 "##6 
	#6 #6 #6 #6J&&*?&	sTz3:%	&& & & &(4(3- 4D 4 4 4 4)!#)3;C=)	) ) ) )MT#Y M49 M M M M M M M Mr   r
   )collections.abcr   regexr   transformersr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   vllm.loggerr   vllm.reasoningr   rA   loggerr
    r   r   <module>rT      s    % $ $ $ $ $     0 0 0 0 0 0      A @ @ @ @ @ # # # # # # * * * * * *	X		aM aM aM aM aM? aM aM aM aM aMr   