o
    -i#                     @   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 G dd de	Zd	S )
    )Sequence)ChatCompletionRequest)DeltaMessage)ResponsesRequest)BaseThinkingReasoningParser)TokenizerLikec                       s   e Zd ZdZedefddZedefddZde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deeB deedB edB f 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 fddZ  ZS )Step3p5ReasoningParsera"  
    Reasoning parser for Step3p5 model.

    Step3p5 uses the <think>...</think> format, but it tends to emit an extra
    newline immediately before and/or after the </think> token. This parser trims:
      - the newline right before </think>
      - the newline right after </think>
    returnc                 C      dS )Nz<think> selfr   r   d/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/reasoning/step3p5_reasoning_parser.pystart_token      z"Step3p5ReasoningParser.start_tokenc                 C   r
   )Nz</think>r   r   r   r   r   	end_token   r   z Step3p5ReasoningParser.end_token	tokenizerc                    s*   t  j|g|R i | d| _d| _d S )NF   )super__init___pending_reasoning_newline
end_offset)r   r   argskwargs	__class__r   r   r   #   s   
zStep3p5ReasoningParser.__init__	input_idsc                 C   0   | j |v r| jdkr|  jd8  _dS | jdk S Nr   r   Fend_token_idr   )r   r   r   r   r   is_reasoning_end/   s   
z'Step3p5ReasoningParser.is_reasoning_end	delta_idsc                 C   r   r   r   )r   r   r"   r   r   r   is_reasoning_end_streaming5   s   
z1Step3p5ReasoningParser.is_reasoning_end_streamingmodel_outputrequestNc                    sF   t  ||\}}|d ur|d}|d ur|d}|pd |p!d fS )N
)r   extract_reasoningremovesuffixremoveprefix)r   r$   r%   	reasoningcontentr   r   r   r'   =   s   

z(Step3p5ReasoningParser.extract_reasoningprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc                    s  | | jr!|r!|dkrd S |dr!|d}|rt|dS d S t ||||||}|d u r2d S | j|vrq| j|vrq| j|v ra|	| j}	|d |	 }
||	t
| j d  }t|
|p]d d}n| j|v rlt|d}nt|d}|j}|j}|d ur| jrd| }d| _| dr|d}| j|v rd| _nd| _|d ur|  jd8  _d| _| j|v r|dr|d}|pd }|pd }|d u r|d u rd S t||dS )Nr&   )r+   )r*   r+   )r*   FTr   )endswithr   
startswithr)   r   r   extract_reasoning_streamingstart_token_idr    findlenr*   r+   r   r(   r   )r   r,   r-   r.   r/   r0   r1   	remainingret	end_indexr*   r+   reasoning_to_outputcontent_to_outputr   r   r   r4   I   s^   


	








z2Step3p5ReasoningParser.extract_reasoning_streaming)__name__
__module____qualname____doc__propertystrr   r   r   r   r   intboolr!   r#   r   r   tupler'   r   r4   __classcell__r   r   r   r   r      sJ    	
r   N)collections.abcr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   *vllm.entrypoints.openai.responses.protocolr   vllm.reasoning.basic_parsersr   vllm.tokenizersr   r   r   r   r   r   <module>   s   