o
    
۾i                     @   s   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
 d dlmZ d dlmZ d d	lmZ eeZd
ddddiddgdgdddZdedee fddZdee defddZG dd deZdS )    N)Sequence)PreTrainedTokenizerBase)
ToolServer)ChatCompletionRequest)DeltaMessage)parse_chat_output)init_logger)ReasoningParserstructural_tagtriggered_tagsz<|channel|>analysis<|message|>typeany_text<|end|>begincontentendz<|channel|>analysisF)r   tagstriggersstop_after_first)r   formattoolreturnc                 C   s0   d|  ddiddd|  ddiddg}|S )N<|channel|>commentary to=r   r   r   r   z<|channel|>analysis to= )r   tagr   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/vllm/reasoning/gptoss_reasoning_parser.pyfrom_builtin_tool_to_tag$   s   r   builtin_tool_listc                 C   sH   dd l }|| }|d d d |D ]}|d d t| q|S )Nr   r   r   r   r   )copydeepcopyappendextendr   )no_func_reaonsing_tagr   r   new_tagr   r   r   r   tag_with_builtin_funcs4   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deedB edB f fddZdedB dedB dedB fddZ  ZS )GptOssReasoningParserz
    Reasoning parser for GptOss model.

    The GptOss model uses harmony to extract reasoning content and this parser
    is only used for detecting the end of the reasoning content.
    	tokenizerc                    s@   t  j|g|R i | | jd| _| jd| _d| _d S )Nz<|channel|>finalz<|message|>   )super__init__model_tokenizerencodereasoning_end_token_ids_prefixreasoning_end_token_ids_suffix reasoning_max_num_between_tokens)selfr'   argskwargs	__class__r   r   r*   G   s   
zGptOssReasoningParser.__init__	input_idsr   c                 C   s   | j }| j}t|dksJ dt|dksJ dtt|t| ddD ]=}|||t|  |krc|t| }t|t|t| d D ]}|| | jkrR n|||t|  |krb  dS qGq&dS )Nr   z'reasoning_end_token_ids_prefix is emptyz'reasoning_end_token_ids_suffix is empty   TF)r-   r.   lenranger/   )r0   r5   end_token_ids_prefixend_token_ids_suffixisuffix_startjr   r   r   is_reasoning_endQ   s&   z&GptOssReasoningParser.is_reasoning_endc                 C   s&   t |\}}}|d u rg S | j|S )N)r   r+   r,   )r0   r5   _r   r   r   r   extract_content_idsh   s   z)GptOssReasoningParser.extract_content_idsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                 C   s   t t|\}}}	t t|\}
}}	d }d }|
d ur0|pd}|
|r.|
t|d  p,d }n|
}|d urJ|p7d}||rH|t|d  pFd }n|}|d u rT|d u rTd S t||dS )N )	reasoningr   )r   list
startswithr8   r   )r0   rB   rC   rD   rE   rF   rG   prev_reasoningprev_contentr@   cur_reasoningcur_contentreasoning_deltacontent_deltaprev_rprev_cr   r   r   extract_reasoning_streamingn   s"   	

z1GptOssReasoningParser.extract_reasoning_streamingmodel_outputrequestc                 C   s   t d)Nzhgpt-oss has a special branch for parsing reasoning in non-streaming mode. This method shouldn't be used.)NotImplementedError)r0   rU   rV   r   r   r   extract_reasoning   s   z'GptOssReasoningParser.extract_reasoningoriginal_tagtool_serverc                 C   s   |d u rO|d u rt tS g }|dr|d |dr#|d |dr-|d t|dkrCtd| t tt|}|S td t t}|S |S )Nbrowserpython	containerr   zBuiltin_tool_list: %szBuiltin_tool_list is empty)	jsondumpsr#   has_toolr!   r8   loggerinfor%   )r0   rY   rZ   r   func_tagr   r   r   prepare_structured_tag   s(   








z,GptOssReasoningParser.prepare_structured_tag)__name__
__module____qualname____doc__r   r*   r   intboolr?   rJ   rA   strr   rT   r   tuplerX   r   rd   __classcell__r   r   r3   r   r&   ?   sD    



r&   )r^   collections.abcr   transformersr    vllm.entrypoints.mcp.tool_serverr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   ,vllm.entrypoints.openai.parser.harmony_utilsr   vllm.loggerr   vllm.reasoningr	   re   ra   r#   rk   rJ   dictr   r%   r&   r   r   r   r   <module>   s0   