
    .`i                         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Zdee         defdZ G 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                 2    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   tags     z/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/reasoning/gptoss_reasoning_parser.pyfrom_builtin_tool_to_tagr   $   sT     877
+	
 	
 6t55
+	
 	
C J    builtin_tool_listc                     dd l }|                    |           }|d         d                             d           |D ]0}|d         d                             t	          |                     1|S )Nr   r   r   r   r   )copydeepcopyappendextendr   )no_func_reaonsing_tagr!   r#   new_tagr   s        r   tag_with_builtin_funcsr)   4   s|    KKKmm122GHj!(()DEEE! I I&!(()A$)G)GHHHHNr    c                       e Zd ZdZdef fdZdee         defdZ	de
e         de
e         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dz  dedz  dedz  fdZ x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                      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__s       r   r0   zGptOssReasoningParser.__init__G   ss    4T444V444 /3.B.I.I/
 /
+ /3.B.I.I-.X.X+02---r    	input_idsr   c                 "   | j         }| j        }t          |          dk    s
J d            t          |          dk    s
J d            t          t          |          t          |          z
  dd          D ]}|||t          |          z            |k    rw|t          |          z   }t          |t          |          t          |          z
  dz             D ]4}||z
  | j        k    r n#|||t          |          z            |k    r  dS 5dS )Nr   z'reasoning_end_token_ids_prefix is emptyz'reasoning_end_token_ids_suffix is empty   TF)r3   r4   lenranger5   )r6   r:   end_token_ids_prefixend_token_ids_suffixisuffix_startjs          r   is_reasoning_endz&GptOssReasoningParser.is_reasoning_endQ   sS   #B#B'((1,,,.W,,,'((1,,,.W,,, s9~~,@(A(AA2rJJ 	$ 	$AQ%9!:!:::;?SSS 3';#<#<< #i..37K3L3L"Lq"P  	$ 	$A <'4+PPP!!a#.B*C*C&C"CD/0 0  $ttt0 ur    c                 d    t          |          \  }}}|g S | j                            |          S )N)r   r1   r2   )r6   r:   _r   s       r   extract_content_idsz)GptOssReasoningParser.extract_content_idsh   s6    ))447A?I#**7333r    previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                    t          t          |                    \  }}}	t          t          |                    \  }
}}	d }d }|
5|pd}|
                    |          r|
t          |          d          pd }n|
}|5|pd}|                    |          r|t          |          d          pd }n|}||d S t	          ||          S )N )	reasoningr   )r   list
startswithr>   r   )r6   rI   rJ   rK   rL   rM   rN   prev_reasoningprev_contentrG   cur_reasoningcur_contentreasoning_deltacontent_deltaprev_rprev_cs                   r   extract_reasoning_streamingz1GptOssReasoningParser.extract_reasoning_streamingn   s     +<DAS<T<T*U*U'a(9$?P:Q:Q(R(R%{A$#)rF''// 0"/F">"F$"/"!'RF%%f-- , +CKKMM : Bd +"}'<4o}MMMMr    model_outputrequestc                      t          d          )Nzhgpt-oss has a special branch for parsing reasoning in non-streaming mode. This method shouldn't be used.)NotImplementedError)r6   r]   r^   s      r   extract_reasoningz'GptOssReasoningParser.extract_reasoning   s    
 "v
 
 	
r    original_tagtool_serverc                 X   |&|t          j        t                    S g }|                    d          r|                    d           |                    d          r|                    d           |                    d          r|                    d           t          |          dk    rCt                              d|           t          j        t          t          |                    }n3t                              d           t          j        t                    }|S |S )Nbrowserpython	containerr   zBuiltin_tool_list: %szBuiltin_tool_list is empty)	jsondumpsr'   has_toolr%   r>   loggerinfor)   )r6   rb   rc   r!   func_tags        r   prepare_structured_tagz,GptOssReasoningParser.prepare_structured_tag   s#    "z"7888/1!''	22 8%,,Y777''11 7%,,X666''44 :%,,[999())A--KK 79JKKK#z./DFWXX   HH KK <===#z*?@@H  r    )__name__
__module____qualname____doc__r   r0   r   intboolrE   rR   rH   strr   r\   r   tuplera   r   rn   __classcell__)r9   s   @r   r+   r+   ?   s        3"9 3 3 3 3 3 3(3- D    .4T#Y 449 4 4 4 4NN N 	N
 %SMN $C=N "#N 
	N N N N:

 '
 
sTz3:%	&	
 
 
 
 $J 5?$5F 	t               r    r+   )rh   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
   ro   rk   r'   ru   rR   dictr   r)   r+   r   r    r   <module>r      s    $ $ $ $ $ $ 0 0 0 0 0 0 7 7 7 7 7 7      A @ @ @ @ @ J J J J J J # # # # # # * * * * * *	X		   :"J/  
 ++!   "3 4:     T#Y SW    q  q  q  q  q O q  q  q  q  q r    